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:
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!
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.
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?
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.
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. foo()
, this
bezieht sich auf die globale Variable (das oberste Objekt, das alle anderen globalen Variablen in Ihrem js-Programm enthält). .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:
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.
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%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.
Tags und Links javascript prototypal-inheritance