首頁  >  文章  >  web前端  >  原型繼承存在的部分問題

原型繼承存在的部分問題

一个新手
一个新手原創
2017-09-06 11:48:591066瀏覽

當我們使用原型鏈繼承時,需要謹慎的定義原型上的方法和屬性,因為這可能會帶來意外的結果。

一、謹慎的定義原型上的方法。
當我們想為一個建構函數的原型上定義一個方法時,一定要在更改原型後再定義,否則新的原型物件上不會有定義的這個方法,導致與我們預期的結果不同。範例:


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 }
 


############################ ##三、物件實例與原型存在直接對應關係。 ######意思是說當一個對__proto__就會保存原型的參考位址,即使建構函式的prototype發生改變,也不會對先前建立的實例中的__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'
### #########四、最好不要在原型上定義值為引用型別的屬性。 ######如果在原型上定義值為引用型別的屬性,那麼所有實例都會共用該屬性值(引用型別值,指向同一個物件),當其中一個實例修改該參考型別上的值或屬性時,所有實例上的都會發生改變。因此值為引用型別的屬性,最好在建構函式中定義。範例############
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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn