Maison  >  Article  >  interface Web  >  Quelques problèmes avec l'héritage prototype

Quelques problèmes avec l'héritage prototype

一个新手
一个新手original
2017-09-06 11:48:591053parcourir

Lorsque nous utilisons l'héritage de chaîne de prototype, nous devons être prudents dans la définition des méthodes et des propriétés sur le prototype, car cela peut entraîner des résultats inattendus.

1. Définir soigneusement les méthodes sur le prototype.
Lorsque nous voulons définir une méthode sur le prototype d'un constructeur, nous devons la définir après avoir changé le prototype, sinon le nouvel objet prototype n'aura pas cette méthode définie, ce qui entraînera les résultats que nous attendions différents. Exemple :


1 function superObj(){}
2 superObj.prototype.sayHi=function sayHi(){
3     console.log('hi');
4 };
5 superObj.prototype={
6 name:'Poly'
7 };
8 var obj=new superObj();
9 obj.sayHi();//报错!! superObj.sayHi is not a function

Le fonctionnement correct est le suivant


1 function superObj(){}
2 superObj.prototype={
3     name:'Poly'
4 };
5 superObj.prototype.sayHi=function sayHi(){6     console.log('hi');7 };8 var obj=new superObj();9 obj.sayHi();// 'hi'

2. N'utilisez pas de littéraux d'objet pour créer des propriétés/méthodes pour des prototypes.
L'utilisation de littéraux d'objet créera un nouvel objet et attribuera l'adresse de référence du nouvel objet au prototype du constructeur. Par exemple,


1 function superObj(){}
2 superObj.prototype={
3     sayHi:function sayHi(){
4         console.log('hi');
5     }
6 }

L'opération correcte est la suivante :


1 function superObj(){}
2 superObj.prototype.sayHi=function sayHi(){
3     console.log('hi');
4 }

3. Il existe une correspondance directe entre les instances d'objet et les prototypes.
Cela signifie que lorsqu'une référence à __proto__ est faite, l'adresse de référence du prototype sera enregistrée Même si le prototype du constructeur change, cela n'affectera pas le __proto__ dans l'instance précédemment créée. Exemple


 1 function superObj(){} 
 2 superObj.prototype.say=function() { 
 3     console.log('hello'); 
 4 } 
 5 var obj=new superObj();
 6 superObj.prototype={ 
 7     say:function() { 
 8         console.log('world'); 
 9     }
 10 };
 11 var obj2=new superObj();
 12 obj.say();//'hello'
 13 obj2.say();//'world'

4. Il est préférable de ne pas définir d'attributs avec des types référence sur le prototype.
Si une propriété dont la valeur est un type référence est définie sur le prototype, alors toutes les instances partageront la valeur de la propriété (valeur du type référence, pointant vers le même objet), et lorsqu'une des instances modifiera la valeur ou propriété sur le type de référence, les modifications se produiront sur toutes les instances. Par conséquent, les propriétés dont les valeurs sont des types référence sont mieux définies dans le constructeur. Exemple


1 function superObj(){}
2 superObj.prototype.ary=[1,2,3];
3 var obj1=new superObj();
4 var obj2=new superObj();
5 obj1.ary[0]=0;//obj1.ary和obj2.ary指向的是同一个数组,当obj1修改此数组时,obj2.ary也会发生改变
6 console.log(obj2.ary[0]);//0
<br/>

Si vous ne souhaitez pas que les instances partagent le même objet de référence, vous devez le définir dans le constructeur. Exemple


1 function superObj(){
2     this.ary=[1,2,3];
3 }
4 var obj1=new superObj();
5 var obj2=new superObj();
6 obj1.ary[0]=0;//obj1.ary和obj2.ary指向的不是同一个数组,所以修改obj1.ary不会影响obj2.ary
7 console.log(obj2.ary[0]);//1

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!

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