プロトタイプ チェーンの継承を使用する場合、予期しない結果が生じる可能性があるため、プロトタイプでメソッドとプロパティを定義する際には注意する必要があります。
1. プロトタイプのメソッドを慎重に定義します。
コンストラクターのプロトタイプにメソッドを定義したい場合は、プロトタイプを変更した後にメソッドを定義する必要があります。そうしないと、新しいプロトタイプ オブジェクトにこのメソッドが定義されず、予想とは異なる結果が生じます。例:
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
正しい操作は次のとおりです
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. プロトタイプの属性/メソッドの作成にオブジェクト リテラルを使用しないでください。
オブジェクト リテラルを使用すると、新しいオブジェクトが作成され、新しいオブジェクトの参照アドレスがコンストラクターのプロトタイプに割り当てられます。例
1 function superObj(){} 2 superObj.prototype={ 3 sayHi:function sayHi(){ 4 console.log('hi'); 5 } 6 }
正しい操作は次のとおりです:
1 function superObj(){} 2 superObj.prototype.sayHi=function sayHi(){ 3 console.log('hi'); 4 }
3. オブジェクト インスタンスとプロトタイプの間には直接の対応関係があります。
これは、__proto__ への参照が行われたときに、コンストラクターのプロトタイプが変更されても、以前に作成されたインスタンス内の __proto__ には影響を与えないことを意味します。例
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. プロトタイプでは参照型を使用して属性を定義しないことが最善です。
プロトタイプで参照型の値を使用してプロパティを定義すると、インスタンスの 1 つがプロトタイプの値またはプロパティを変更すると、すべてのインスタンスがそのプロパティ値 (同じオブジェクトを指す参照型の値) を共有します。参照型、すべてのインスタンスは上記のすべてが変更されます。したがって、値が参照型であるプロパティはコンストラクターで定義するのが最適です。例
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/>
インスタンスが同じ参照オブジェクトを共有したくない場合は、コンストラクターで定義する必要があります。例
<br/>
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
以上がプロトタイプの継承に関するいくつかの問題の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。