js繼承的幾種方法 js高階程式設計

2021-08-19 22:43:18 字數 1778 閱讀 3087

**:js高階程式設計

前面的例子中展示的原型鏈少了一環,所有引用型別預設都繼承了object,而這個繼承也是通過原型鏈實現的。因此預設的原型都包含乙個內部指標,指向object.prototype,這也正是所有自定義型別會繼承tostring()、valueof()等預設方法的根本原因。換句話說object.prototype就是原型鏈的末端。 

2、確定原型和例項的關係

通過兩種方式可以確定原型和例項之間的關係,第一種是使用instanceof操作符,第二種是使用isprototypeof()方法。 

例項 instanceof 原型鏈 中出現過的建構函式,都會返回true 

console.log(person instanceof child);//true 

console.log(person instanceof parent);//true 

console.log(person instanceof object);//true 

isprototype(),只要是原型鏈中出現過的原型,都可以說是該原型鏈所派生出來的例項的原型,因此也返回true. 

console.log(object.prototype.isprototypeof(instance));//true 

console.log(parent.prototype.isprototypeof(instance));//true 

console.log(child.prototype.isprototypeof(instance));//true 

3、謹慎地定義方法

子型別有時候需要覆蓋超型別中的某個方法,或者需要新增超型別中不存在的莫個方法,注意:給原型新增方法的**一定要放在替換原型的語句之後。 

當通過child的例項呼叫getparentvalue()時,呼叫的是這個重新定義過的方法,但是通過parent的例項呼叫getparentvalue()時,呼叫的還是原來的方法。 

格外需要注意的是:必須要在parent的例項替換原型之後,再定義這兩個方法。 

還有一點需要特別注意的是:通過原型鏈實現繼承時,不能使用物件字面量建立原型方法,因為這樣做會重寫原型鏈。 

以上**剛把parent的例項賦值給child的原型物件,緊接著又將原型替換成乙個字面量,替換成字面量之後,child原型實際上包含的是乙個object的例項,而不再是parent的例項,因此我們設想中的原型鏈被切斷.parent和child之間沒有任何關聯。 

4、原型鏈的問題

原型鏈很強大,可以利用它來實現繼承,但是也有一些問題,主要的問題還是包含引用型別值的原型屬性會被所有例項共享。因此我們在建構函式中定義例項屬性。但是在通過原型來實現繼承時,原型物件其實變成了另乙個型別的例項。於是原先定義在建構函式中的例項屬性變成了原型屬性了。 

舉例說明如下: 

在parent建構函式中定義了乙個friends屬性,該屬性值是乙個陣列(引用型別值)。這樣,parent的每個例項都會各自包含自己的friends屬性。當child通過原型鏈繼承了parent之後,child.prototype也用用了friends屬性——這就好像friends屬性是定義在child.prototype一樣。這樣child的所有例項都會共享這個friends屬性,因此我們對kid1.friends做的修改,在kid2.friends中也會體現出來,顯然,這不是我們想要的。 

原型鏈的另乙個問題是:在建立子型別的例項時,不能在不影響所有物件例項的情況下,給超型別的建構函式傳遞引數。因此,我們通常很少會單獨使用原型鏈。

js繼承的幾種方法

繼承的幾種方法 1.傳統形式 繼承過多沒用的東西 father.prototype.name hzl function father var father new father son.prototype father function son var son new son console.log...

JS實現繼承的幾種方法

call方法的第乙個引數的值賦值給類 即方法 中出現的 this call方法的第二個引數開始依次賦值給類 即方法 所接受的引數 call 相同,第二個引數為陣列型別,這個陣列中的每個元素依次賦值給類 即方法 所接受的引數 this 的指向,我們就是利用它的這個特性來實現繼承的。補充知識點 func...

js實現繼承的幾種方法

js實習繼承的幾種方法 1.for in繼承 function person function son var p new person var s new son for var k in p console.log s.name 水煮魚 console.log s.age 18 2.原型繼承 f...