Javascript "this" im statischen Methoden
Habe ich einen code wie:
User = function(){}
User.a = function(){
return "try";
}
User.b = function(){
}
Vom Benutzer.b() ich kann call User.a() Verwendung:
User.b = function(){
return User.a();
}
aber nicht mit dieser, da es nicht eine Instanz des Benutzers (der Benutzer.ein() und Benutzer.b() sind so etwas wie "statische Methoden").
Was ich will zu tun ist, um der Lage sein, Benutzer.a() vom Benutzer.b (), ohne zu wissen, was ist die Hauptfunktion, in diesem Fall der Benutzer.
Etwas wie diese verwendet werden, die in statischen Methoden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Realität gibt es keine Methoden oder statische Methoden in js gibt es nur Funktionen, die zugeordnet werden Objekt-Eigenschaften (Funktionen als Objekte, als auch), und Sie alle funktionieren auf die gleiche Weise. Da, Sie nennen es wie
User.b()
,this
wirdUser
für den Anruf.User.b
wievar a = User.b
und es ändert alles, wenn Sie anrufena()
. Ein üblicher Weg, um dies zu sehen ist, fügen Sie Ereignis-listener wieelem.addEventListener( "click", this.clicked, false )
kann gelöst werden durch Verwendung vonugly hacks
, obwohl viele einfach oop zu diesem Punkt, und verwenden Sie inline-Verschlüsse. Mein Punkt ist, dassthis.clicked
ist nicht verbunden mitthis
an alle, es ist nur eine dumme Funktion Verweis.addEventListener
Beispiel, ist Ihr argument für JS nicht mit Methoden ist, dass die Funktion die Werte nicht Kapseln Ihre invocants. Ich denke, es zeigt, dass, während JS hat first-class-Funktionen (die Sie übergeben können, um Funktion, Werte), es muss nicht first-class-Methoden (diese Werte beinhalten nicht die invocant). Also werde ich kaufen, die Methoden sind nicht Erster Klasse in JS. Aber ich nicht kaufen, dass Sie nicht existieren, weil die Magie Einstellung derthis
macht keinen Sinn ohne Sie.method - function that is the value of a property
. So in der Realität (was ich ursprünglich behauptet), es ist nur eine Funktion. Sicher kann man das nennen Sie Methoden, statische Methoden, Klassen usw. aber es funktioniert nur, wenn der Zuhörer wirklich versteht, in den ersten Platz. Wenn die OP so verstanden, dass es nur eine Funktion angefügt, um eine Eigenschaft und nicht um eine statische Methode, die er wohl nicht gemacht haben, die Frage in den ersten Platz.Die einzige Sache, die bestimmt der Kontext die Funktion ist, wie Sie es nennen.
Wenn Sie nennen Sie es mit einem einfachen Bezeichner (name einer Funktion, eine variable oder eine Eigenschaft), wird der Kontext der globalen
window
Objekt:Wenn Sie es nennen, die über einen Zeitraum Zugriff auf ein Objekt Mitglied, wird der Kontext des Objekts:
Wenn Sie kopieren ein Element aus einem Objekt einer Variablen, gibt es keine Verbindung zu dem Objekt, und es wird genannt werden mit
window
als Kontext:Wenn Sie eine Funktion zuweisen, die als eine Eigenschaft an ein Objekt, und rufen Sie es mit dem Objekt, wird der Kontext des Objekts:
Für Ihren speziellen Fall
User
ist eine Funktion, die auch ein Objekt ist.Wenn Sie rufen Sie die Funktion mit
User.b
, Ihr Kontext wird dieUser
Objekt, was eine Funktion in diesem Fall. Innerhalb der Funktion können Sie immer nochthis
Zugriff auf die Kontext:foo.bar
ist einfach nur Zucker fürfoo['bar']
. Wenn Sie rufen Sie eine Funktion ein Objekt aus einem container und nennen esthis
festgelegt wird, um den container:SomeObject.someFunction()
-this
eingestellt istSomeObject
;SomeObject['someFunction']()
- das gleiche;(SomeObject.someFunction)()
- die gleichen(!);(f = SomeObject.someFunction)()
-this
ist auf das Globale Objekt.Ihnen haben keine normale Vererbung in javascript. Ich denke, Sie versuchen, so etwas zu tun:
Benutzer wird ein Konstruktor. Jede neue Instanz des Benutzers haben Zugang zu diesen Methoden. Also, wenn Sie wollen, erstellen Sie eine neue Instanz der Klasse Benutzer, können Sie das Schlüsselwort new, verwenden:
und dann haben Sie Zugriff auf alle Methoden, die vom Benutzer mit Hilfe von client -
a()
... das wird IhnenReferenceError
. Meinst duthis.a()
Gut, Funktionen existieren unabhängig von den container-Objekte; Sie sind nur Werte. So wenn Sie sind nicht gefordert, Sie als Methoden auf einem Objekt Erben, was
this
ist in den aufrufenden Kontext. In diesem Fall erwarten, dass Sie wissen, über Ihre container wäre die gleiche wie die ZuordnungUser.x
den Wert 1, und dann zu erwarten, dass die Zahl 1 ja irgendwie wissen, überUser
.Allerdings, wenn Sie anrufen
User.a()
oderUser.b()
Sie sind in der Tat, nannte Sie als Methoden - Methoden der (Funktions-Objekt)User
. Sothis
wird die gleiche sein, wieUser
, undb
können einfach anrufenthis.a()
und Sie sollten gut zu gehen.