Si vous n'avez jamais été exposé à des langages dynamiques, ce sera un sentiment magique et étrange de comprendre JavaScript avec la façon de penser des langages compilés, car des choses qui sont consciemment impossibles se produisent souvent, et semblent même déraisonnables si vous l'êtes. apprentissage Lorsque vous rencontrez ce sentiment dans le processus de JavaScript, un langage libre et en constante évolution, alors à partir de maintenant, s'il vous plaît, déposez vos "préjugés", car c'est définitivement un nouveau continent pour vous, laissez JavaScript
D'accord, passons aux choses sérieuses. Tout d'abord, comprenons les caractéristiques du contexte d'exécution qui changent dynamiquement de JavaScrtipt. Cette fonctionnalité se reflète principalement dans l'utilisation des méthodes d'application et d'appel.
1. Définition de la méthode
méthode d'appel :
Syntaxe : call(thisObj, Object)
Définition : Appeler une méthode d'un objet pour remplacer l'objet actuel par un autre objet.
Description :
La méthode call peut être utilisée pour appeler une méthode au nom d'un autre objet. La méthode d'appel modifie le contexte d'objet d'une fonction du contexte initial au nouvel objet spécifié par thisObj.
Si le paramètre thisObj n'est pas fourni, l'objet Global est utilisé comme thisObj.
Méthode d'application :
Syntaxe : apply(thisObj, [argArray])
Définition : Appliquer une méthode d'un objet pour remplacer l'objet actuel par un autre objet.
Description :
Si argArray n'est pas un tableau valide ou n'est pas un objet arguments, une TypeError sera provoquée.
Si ni argArray ni thisObj ne sont fournis, l'objet Global sera utilisé comme thisObj et aucun paramètre ne pourra être transmis.
-------------------------------------------------------------- --- ------------------------------------
Remarque : les méthodes call et apply sont exactement les mêmes, sauf que apply utilise un tableau pour transmettre les paramètres.
Exemple de code :
function Animal(name) { this.name = name; this.showName = function() { console.log(this.name); }; } function Cat(name) { Animal.call(this, name); } Cat.prototype = new Animal(); function Dog(name) { Animal.apply(this, name); } Dog.prototype = new Animal(); var cat = new Cat("Black Cat"); //call必须是object var dog = new Dog(["Black Dog"]); //apply必须是array cat.showName(); dog.showName(); console.log(cat instanceof Animal); console.log(dog instanceof Animal);
-------------------------------------------------------------- --- --------------------------------
Simuler l'appel, appliquer ce remplacement
function Animal(name) { this.name = name; this.showName = function() { alert(this.name); }; }; function Cat(name) { this.superClass = Animal; this.superClass(name); delete superClass; } var cat = new Cat("Black Cat"); cat.showName();
Résumé :
Leurs définitions respectives :
appliquer : appliquer une méthode d'un objet et remplacer l'objet actuel par un autre objet.
call : Appelez une méthode d'un objet pour remplacer l'objet actuel par un autre objet.
Ce qu'ils ont en commun :
Les deux "peuvent être utilisés pour appeler une méthode au lieu d'un autre objet, en changeant le contexte d'objet d'une fonction du contexte initial au nouvel objet spécifié par thisObj." - Extrait de JScript5.5.chm
Leurs différences :
apply : Il ne peut y avoir que deux paramètres au maximum : le nouvel objet this et un tableau argArray. Si plusieurs paramètres sont transmis à cette méthode, tous les paramètres seront écrits dans ce tableau. Bien entendu, même s'il n'y a qu'un seul paramètre, il sera écrit dans le tableau. Si argArray n'est pas un tableau valide ou n'est pas un objet arguments, une TypeError sera provoquée. Si ni argArray ni thisObj ne sont fournis, l'objet Global sera utilisé comme thisObj et aucun paramètre ne pourra être transmis.
appel : il s'agit d'une liste de paramètres directe, principalement utilisée lorsque diverses méthodes d'objets js s'appellent mutuellement pour maintenir la cohérence du pointeur d'instance actuel, ou pour modifier ce pointeur dans des circonstances particulières. Si le paramètre thisObj n'est pas fourni, l'objet Global est utilisé comme thisObj.
Pour le dire plus simplement, les fonctions de apply et call sont les mêmes, mais la forme de la liste de paramètres transmise est différente : par exemple, la méthode d'écriture apply correspondante de func.call(func1,var1,var2,var3 ) est : func.apply(func1,[var1 ,var2,var3])