Heim  >  Artikel  >  Web-Frontend  >  Die magische call()-Methode in JavaScript_javascript-Tipps

Die magische call()-Methode in JavaScript_javascript-Tipps

WBOY
WBOYOriginal
2016-05-16 16:10:061067Durchsuche

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:

Code kopieren Der Code lautet wie folgt:

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:

Code kopieren Der Code lautet wie folgt:
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.

Code kopieren Der Code lautet wie folgt:
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