Maison > interface Web > js tutoriel > Analyser les quatre façons de créer des objets en Javascript

Analyser les quatre façons de créer des objets en Javascript

怪我咯
Libérer: 2017-03-30 10:03:15
original
1237 Les gens l'ont consulté

Préface

Il existe de nombreuses façons de créer des objets en utilisant JavascriptMaintenant Énumérons quatre méthodes et énumérons les avantages et les inconvénients de chaque méthode, afin que chacun puisse choisir de les utiliser.

Modèle d'usine

function createPerson(name, age){
 var obj = new Object();
 obj.name = name;
 obj.age = age;
 return obj; //一定要返回,否则打印undefined:undefined
 }
 var person1 = new createPerson('Young',18);
 console.log(person1.name + ':' + person1.age);
Copier après la connexion

Avantages : Le modèle d'usine peut résoudre le problème de la création de plusieurs modèles similaires objets

Inconvénients : Ne résout pas le problème de la reconnaissance des objets (comment déterminer le type d'un objet)

ConstructeurMotif

function Person(name,age){
 this.name = name;
 this.age = age;
 }
 var person1 = new Person('Young',18);
 console.log(person1.name + ':' + person1.age);
Copier après la connexion

Avant de parler des avantages et des inconvénients, racontons d'abord une petite histoire sur elle-même

Utiliser le constructeur comme fonction

function Person(name,age){
 this.name=name;
 this.age=age;
 this.sayName=function(){
 return this.name;
 }
 }
 
 //当做构造函数使用
 var person1 = new Person('Young', 18);
 person1.sayName();
 console.log(person1.name + ':' + person1.age);
 
 //当做普通函数调用
 Person('Wind', 18);
 console.log(window.sayName());
 
 //在另一个作用域中调用
 var obj = new Object();
 Person.call(obj, 'bird', 100);
 console.log(obj.sayName());
Copier après la connexion

Avantages et inconvénients du constructeur

Avantages : peut identifier ses instances comme un type spécifique

Inconvénients : Chaque méthode doit être recréée sur chaque instance. Bien sûr, vous pouvez également le modifier comme ceci :

function Person(name, age){
 this.name = name;
 this.age = age;
 this.sayName = sayName;
 }
 function sayName(){
 return this.name;
 }
Copier après la connexion


est modifié pour appeler la fonction globale, il n'y a donc aucune encapsulation du tout. . . Le prochain Modèle de prototype peut compenser cette lacune

Modèle de prototype

function Person(){
 
 }
 Person.prototype.name = 'Young';
 Person.prototype.age = 18;
 Person.prototype.sayName = function(){
 return this.name;
 }
 
 var person1 = new Person();
 console.log(person1.sayName());
 var person2 = new Person();
 console.log(person1.sayName());
 alert(person1.sayName === person2.sayName);
 //person1和person2访问的是同一组属性的同一个sayName()函数
Copier après la connexion

Bien qu'il soit accessible via des instances d'objet enregistré dans La valeur dans le prototype, mais la valeur dans le prototype ne peut pas être remplacée via l'objet instance

function Person(){
 
 }
 Person.prototype.name='Young';
 Person.prototype.age=18;
 Person.prototype.sayName=function(){
 return this.name;
 }
 
 var person1=new Person();
 var person2=new Person();
 person1.name='Wind';
 
 console.log(person1.sayName());//Wind
 console.log(person2.sayName());//Young
 alert(person1.sayName==person2.sayName);//true
Copier après la connexion

Lorsque nous appelons

person1.sayName
Copier après la connexion

, deux recherches seront effectué. , l'analyseur détermine d'abord si l'instance person1 a les attributs de

sayName
Copier après la connexion

Si c'est le cas, il appelle ses propres attributs. Sinon, il recherche les attributs dans le prototype.

function Person(){
 
 }
 Person.prototype.name='Young';
 Person.prototype.age=18;
 Person.prototype.sayName=function(){
 return this.name;
 }
 
 var person1=new Person();
 var person2=new Person();
 
 person1.name='Wind';
 console.log(person1.sayName());//Wind
 console.log(person2.sayName());//Young
 
 delete person1.name;
 console.log(person1.sayName());//Young
 console.log(person2.sayName());//Young
Copier après la connexion

Utilisez la méthode

hasOwnPropertyType
Copier après la connexion

pour détecter si une propriété existe dans le prototype ou dans l'instance. Cette méthode est héritée de Object Dans l'instance. est vrai, faux dans le prototype.

Les attributs d'instance sur les objets d'énumération utilisent la méthode

Object.keys()
Copier après la connexion


function Person(){
 
 }
 Person.prototype.name='Young';
 Person.prototype.age=18;
 Person.prototype.sayName=function(){
 return this.name;
 }
 
 var keys=Object.keys(Person.prototype);
 console.log(keys);//["name", "age", "sayName"]
Copier après la connexion

Avantages et inconvénients du modèle de prototype

Avantages : Pas besoin de réitérer chaque méthode sur chaque instance

Inconvénients : Peu de personnes utilisent le modèle prototype seul. . Le problème est listé en détail

function Person(){
 
 }
 Person.prototype={
 constructor:Person,
 name:'Young',
 age:18,
 friends:['Big','Pig'],
 sayName:function(){
 return this.name;
 }
 };
 var p1=new Person();
 var p2=new Person();
 p1.friends.push('Mon');
 console.log(p1.friends);//["Big", "Pig", "Mon"]
 console.log(p2.friends);//["Big", "Pig", "Mon"]
Copier après la connexion

C'est justement parce que les instances ont généralement leurs propres attributs, et nous les mettons ici dans

Person.prototype
Copier après la connexion

, donc Avec la modification de p1, l'instance entière incluant le prototype est modifiée. Eh bien, nous pouvons utiliser une combinaison de modèle de constructeur et de modèle de prototype.

Utilisez le modèle de constructeur et le modèle de prototype en combinaison

function Person(name,age){
 this.name=name;
 this.age=age;
 this.friends=['Big','Pig'];
 }
 Person.prototype={
 sayName:function(){
 return this.name;
 }
 };
 var p1=new Person('Young',18);
 var p2=new Person('Wind',78);
 p1.friends.push('Raganya');
 console.log(p1.friends);//["Big", "Pig", "Raganya"]
 console.log(p2.friends);//["Big", "Pig"]
 console.log(p1.friends==p2.friends);//false
 console.log(p1.sayName==p2.sayName);//true
Copier après la connexion

Ce modèle est actuellement le plus largement utilisé et reconnu pour créer une méthode de type de personnalisation. Est un mode par défaut utilisé pour définir les types de référence.

Résumé

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal