Tout d'abord, jetons un coup d'œil à l'explication officielle de call(), "Appeler une méthode d'un objet et remplacer l'objet actuel par un autre objet." Après avoir lu cette explication, vous pourriez être encore plus confus. Voir exemple :
var x = "Je suis une variable globale" ; //Définir la variable globale x
function a(){ //Définir la structure de la classe de fonctions a
This.x = "Je l'ai déclaré dans la structure de classe de fonctions a"
;
>
//Définissez une fonction normale pour afficher la valeur de la variable x contenue dans le pointeur actuel
fonction f(){
alerte (this.x);
>
//La valeur de retour est "Je l'ai déclaré dans la structure de classe de fonctions a"
f.call(nouveau a());
Je crois comprendre que f.call(new a()) copie la fonction (en fait également un objet) f dans l'objet appelé "new a()" pour analyse. En fait, le résultat de l'analyse est le même que le code suivant :
fonction a(){
this.x = "Je l'ai déclaré dans la structure de classe de fonctions a";
alert(this.x);
>
une();
C'est juste que la portée de la variable Dans l'exemple ci-dessus, f est complètement hérité par l'objet du constructeur a. Si cela ne suffit pas à montrer que a.call(b) est un modèle d'héritage, examinons une utilisation plus axée sur l'héritage.
fonction f(){
Ceci.a = "a"
This.b = function(){
alerte("b");
>
>
fonction e(){
f.appel(ce);
>
var c = nouveau e();
alert(c.a); //Pop up a
c.b(); //Pop-up b
Dans cet exemple, quiconque sait utiliser un navigateur peut voir que e hérite complètement des attributs et des méthodes de f. Sinon, c'est inexplicable, car les attributs a et b ne sont pas définis dans e, il est donc logique de déduire. que Dans l'objet instance c de e, ces deux attributs n'apparaîtront pas.