Maison  >  Article  >  interface Web  >  La méthode magique call() dans les astuces JavaScript_javascript

La méthode magique call() dans les astuces JavaScript_javascript

WBOY
WBOYoriginal
2016-05-16 16:10:061071parcourir

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 :

Copier le code Le code est le suivant :

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 :
Copier le code Le code est le 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.
Copier le code Le code est le suivant :

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.
Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn