Schauen wir uns zunächst die offizielle Erklärung von call() an: „Rufen Sie eine Methode eines Objekts auf und ersetzen Sie das aktuelle Objekt durch ein anderes Objekt.“ Nachdem Sie diese Erklärung gelesen haben, sind Sie möglicherweise noch verwirrter. Siehe Beispiel:
var x = „Ich bin eine globale Variable“; //Globale Variable x definieren
function a(){ //Funktionsklassenstruktur definieren a
This.x = „Ich habe es in der Funktionsklassenstruktur a deklariert“;
}
//Definieren Sie eine normale Funktion, um den Wert der im aktuellen Zeiger enthaltenen Variablen x anzuzeigen
Funktion f(){
Warnung (this.x);
}
//Der Rückgabewert ist „Ich habe es in der Funktionsklassenstruktur a deklariert“
f.call(new a());
Mein Verständnis ist, dass f.call(new a()) die Funktion (eigentlich auch ein Objekt) f zur Analyse in das aufgerufene Objekt „new a()“ kopiert. Tatsächlich ist das Analyseergebnis dasselbe wie der folgende Code:
Funktion a(){
this.x = „Ich habe es in der Funktionsklassenstruktur a deklariert“;
alarm(this.x);
}
a();
Es ist nur der Umfang der Variablen Im obigen Beispiel wird f vollständig vom Objekt des Konstruktors a geerbt. Wenn dies nicht ausreicht, um zu zeigen, dass a.call(b) ein Vererbungsmuster ist, schauen wir uns eine Verwendung an, die eher auf Vererbung ausgerichtet ist.
Funktion f(){
This.a = „a“;
This.b = function(){
alarm("b");
}
}
Funktion e(){
f.call(this);
}
var c = new e();
warning(c.a); //Pop up a
c.b(); //Pop up b
In diesem Beispiel kann jeder, der mit einem Browser vertraut ist, erkennen, dass e die Attribute und Methoden von f vollständig erbt. Andernfalls ist dies unerklärlich, da die Attribute a und b nicht in e definiert sind und es daher vernünftig ist, darauf zu schließen dass im Instanzobjekt c von e diese beiden Attribute nicht erscheinen.
Stellungnahme:Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn