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.