Modèle de constructeur
Les constructeurs comme Object et Array apparaîtront automatiquement dans l'environnement d'exécution au moment de l'exécution. De plus, vous pouvez créer des constructeurs personnalisés pour définir les propriétés et les méthodes des types d'objets personnalisés.
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
};
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
Copier après la connexion
Dans cet exemple, la fonction Person() remplace la fonction createPerson(). Nous avons remarqué qu'en plus des mêmes parties que createPerson(), le code dans Person() présente également les différences suivantes :
1 L'objet n'est pas explicitement créé
< 🎜. >2. Les propriétés et méthodes sont directement affectées à cet objet
3 Il n'y a pas d'instruction return.
Pour créer une nouvelle instance de Person, vous devez utiliser l'opérateur new. Appeler le constructeur de cette manière passe en fait par les 4 étapes suivantes :
(1) Créer un nouvel objet
(2) Attribuer la portée du constructeur au nouvel objet (il s'agit donc de Points vers ; ce nouvel objet);
(3) Exécuter le code dans le constructeur (ajouter des attributs à ce nouvel objet);
(4) Renvoie le nouvel objet);
À la fin de l'exemple précédent, personne1 et personne2 détiennent chacune une instance différente de Personne. Les deux objets ont un attribut constructeur qui pointe vers Person comme indiqué ci-dessous.
alert(person1.constructor == Person); //true
alert(person2.constructor == Person); //true
Copier après la connexion
L'attribut constructeur d'un objet est initialement utilisé pour identifier le type d'objet. Cependant, lorsqu'il s'agit de détecter des types d'objets, l'opérateur instanceof est plus fiable. Tous les objets que nous créons dans cet exemple sont à la fois des instances de Object et des instances de Person, qui peuvent être vérifiées via l'opérateur instanceof.
alert(person1 instanceof Object); //true
alert(person1 instanceof Person); //true
alert(person2 instanceof Object); //true
alert(person2 instanceof Person); //true
Copier après la connexion
Créer un constructeur personnalisé signifie que vous pouvez ultérieurement en identifier les instances comme un type spécifique ; c'est là que le modèle de constructeur surpasse le modèle d'usine. Dans cet exemple, person1 et person2 sont tous deux des instances de Object car tous les objets héritent de Object.
Problèmes avec les constructeurs
Bien que le modèle de constructeur soit facile à utiliser, il n'est pas sans défauts. Le principal problème lié à l’utilisation des constructeurs est que chaque méthode doit être recréée sur chaque instance.
Les fonctions dans ECMAScript sont des objets, donc chaque fois qu'une fonction est définie, un objet est instancié. D'un point de vue logique, le constructeur à ce moment peut également être défini comme ceci.
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = new Function("alert(this.name)"); // 与声明函数在逻辑上是等价的
}
Copier après la connexion
En regardant les constructeurs de ce point de vue, il est plus facile de comprendre l'essence du fait que chaque instance de Person contient une instance de Function différente (pour afficher l'attribut name). Pour être clair, la création d'une fonction de cette manière entraîne différentes chaînes de portée et résolutions d'identifiants, mais le mécanisme de création de nouvelles instances de Function est toujours le même. Par conséquent, les fonctions portant le même nom sur différentes instances ne sont pas égales, comme peut le prouver le code suivant.
alert(person1.sayName == person2.sayName); //false
Copier après la connexion
Cependant, il n'est pas nécessaire de créer deux instances de Function pour accomplir la même tâche ; de plus, avec l'objet this, il n'est pas nécessaire de lier la fonction à un objet spécifique avant d'exécuter le code. Par conséquent, vous pouvez résoudre ce problème en déplaçant la définition de fonction en dehors du constructeur comme suit.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!