Anfügen von Methoden an den Prototyp innerhalb der Konstruktorfunktion

8

Hier ist die Standardmethode des Lehrbuchs zur Beschreibung einer 'Klasse' oder einer Konstruktorfunktion in JavaScript, direkt aus dem Definitiven Leitfaden zu JavaScript :

%Vor%

Ich mag die baumelnde Prototyp-Manipulation hier nicht, also habe ich versucht, eine Möglichkeit zu finden, die Funktionsdefinition für area im Konstruktor zu kapseln. Ich habe mir das ausgedacht, was ich nicht erwartet habe:

%Vor%

Ich habe nicht erwartet, dass das funktioniert, weil die this -Referenz innerhalb der area -Funktion auf die area -Funktion selbst zeigen sollte, also hätte ich keinen Zugriff auf width und height von %Code%. Aber es stellt sich heraus, dass ich es tue!

%Vor%

Einige weitere Tests haben bestätigt, dass der this Verweis innerhalb der this Funktion tatsächlich eine Referenz auf das Objekt im Aufbau war, nicht die Bereichsfunktion selbst.

%Vor%

Stellt sich heraus, dass die Warnung angezeigt wird, und area ist genau das Objekt im Bau . Was ist hier los? Warum ist this nicht this Ich erwarte es?

    
Matthew Taylor 11.03.2010, 22:10
quelle

5 Antworten

5

Ich denke, die richtige Antwort ist, dass Sie das nicht tun sollten, weil Kennebec in dem Kommentar sagte:

  

Wenn du hundert Rechtecke hast, du   werde diesen Prototypen neu deklarieren   Methode hundert Mal.

    
Matthew Taylor 24.03.2010, 16:25
quelle
1

Ich dachte, dass> das     

Heath Borders 11.03.2010 22:20
quelle
1

Die Bedeutung von this hängt davon ab, wie die Funktion aufgerufen wurde:

  • this bezieht sich üblicherweise auf das Objekt, von dem die Funktion zur Laufzeit aufgerufen wird, z. Wenn sie als ob.foo() aufgerufen wird, verweist this in foo auf ob.
  • Wenn eine Funktion auf keine Objekt-bereitgestellte Weise aufgerufen wird, z. nur foo() , this bezieht sich auf die globale Variable (das oberste Objekt, das alle anderen globalen Variablen in Ihrem js-Programm enthält).
  • Und in .call() und .apply() wird das Objekt angegeben, auf das sich this bezieht.

Nun, wenn Sie eine Möglichkeit haben möchten, auf das Objekt der Funktion zu zeigen, in der Ihre Funktion erstellt wurde (dh die 2. Ebene this zum Zeitpunkt der Erstellung), müssten Sie die tieferliegende% co_de umbenennen %, damit es durch den aktuell sichtbaren sichtbar wird. Wenn das klar ist wie Schlamm, sollte dies ein wenig verdeutlichen:

%Vor%

Dieses obige Muster ist nützlich, um ein Objekt mit öffentlichen Methoden zu erstellen, die auf private Mitglieder zugreifen können. Siehe Crockford für wahrscheinlich bessere Erklärungen.

    
squelart 12.03.2010 22:05
quelle
0

Worauf "this" zeigt, wird festgelegt, wenn der Code ausgeführt wird.

Hier ist ein einfacher Weg herauszufinden, was "das" sein sollte.

Wenn Sie '.' Um auf eine Funktion Bezug zu nehmen, wird "dies" eine Referenz auf das sein, was sich auf der linken Seite des '.' befindet.

(Dies gilt nicht für .call und .apply)

%Vor%     
robert 12.03.2010 21:30
quelle
0

Ich denke, du bist dem letzten Beispiel sehr nahe. Wie wäre es mit einer privilegierten Methode:

%Vor%

Siehe Crockfords "Private Mitglieder in JavaScript" für weitere Informationen.

    
dshaw 17.03.2010 14:29
quelle