當我們使用原型鏈繼承時,需要謹慎的定義原型上的方法和屬性,因為這可能會帶來意外的結果。
一、謹慎的定義原型上的方法。
當我們想為一個建構函數的原型上定義一個方法時,一定要在更改原型後再定義,否則新的原型物件上不會有定義的這個方法,導致與我們預期的結果不同。範例:
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'
使用物件字面量,就會新建立一個對象,並把新物件的引用地址賦值給建構函式的prototype。範例
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 }
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'### #########四、最好不要在原型上定義值為引用型別的屬性。 ######如果在原型上定義值為引用型別的屬性,那麼所有實例都會共用該屬性值(引用型別值,指向同一個物件),當其中一個實例修改該參考型別上的值或屬性時,所有實例上的都會發生改變。因此值為引用型別的屬性,最好在建構函式中定義。範例############
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/>###如果不想讓實例共享同一個引用對象,那麼就應該在建構函式中進行定義。例############
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中文網其他相關文章!