理解js繼承的6種方式

2021-08-27 07:59:43 字數 2006 閱讀 2381

想要繼承,就必須要提供個父類(繼承誰,提供繼承的屬性)

一、原型鏈繼承

重點:讓新例項的原型等於父類的例項。

特點:1、例項可繼承的屬性有:例項的建構函式的屬性,父類建構函式屬性,父類原型的屬性。(新例項不會繼承父類例項的屬性!)

缺點:1、新例項無法向父類建構函式傳參。

2、繼承單一。

3、所有新例項都會共享父類例項的屬性。(原型上的屬性是共享的,乙個例項修改了原型屬性,另乙個例項的原型屬性也會被修改!)

二、借用建構函式繼承

特點:1、只繼承了父類建構函式的屬性,沒有繼承父類原型的屬性。

2、解決了原型鏈繼承缺點1、2、3。

3、可以繼承多個建構函式屬性(call多個)。

4、在子例項中可向父例項傳參。

缺點:1、只能繼承父類建構函式的屬性。

2、無法實現建構函式的復用。(每次用每次都要重新呼叫)

3、每個新例項都有父類建構函式的副本,臃腫。

三、組合繼承(組合原型鏈繼承和借用建構函式繼承)(常用)

重點:結合了兩種模式的優點,傳參和復用

特點:1、可以繼承父類原型上的屬性,可以傳參,可復用。

2、每個新例項引入的建構函式屬性是私有的。

缺點:呼叫了兩次父類建構函式(耗記憶體),子類的建構函式會代替原型上的那個父類建構函式。

四、原型式繼承

重點:用乙個函式包裝乙個物件,然後返回這個函式的呼叫,這個函式就變成了個可以隨意增添屬性的例項或物件。object.create()就是這個原理。

特點:類似於複製乙個物件,用函式來包裝。

缺點:1、所有例項都會繼承原型上的屬性。

2、無法實現復用。(新例項屬性都是後面新增的)

五、寄生式繼承

重點:就是給原型式繼承外面套了個殼子。

優點:沒有建立自定義型別,因為只是套了個殼子返回物件(這個),這個函式順理成章就成了建立的新物件。

缺點:沒用到原型,無法復用。

六、寄生組合式繼承(常用)

寄生:在函式內返回物件然後呼叫

重點:修復了組合繼承的問題

繼承這些知識點與其說是物件的繼承,更像是函式的功能用法,如何用函式做到復用,組合,這些和使用繼承的思考是一樣的。上述幾個繼承的方法都可以手動修復他們的缺點,但就是多了這個手動修復就變成了另一種繼承模式。

這些繼承模式的學習重點是學它們的思想,不然你會在coding書本上的例子的時候,會覺得明明可以直接繼承為什麼還要搞這麼麻煩。就像原型式繼承它用函式複製了內部物件的乙個副本,這樣不僅可以繼承內部物件的屬性,還能把函式(物件,**內部物件的返回)隨意呼叫,給它們新增屬性,改個引數就可以改變原型物件,而這些新增的屬性也不會相互影響。

理解js繼承的6種方式

想要繼承,就必須要提供個父類 繼承誰,提供繼承的屬性 一 原型鏈繼承 重點 讓新例項的原型等於父類的例項。特點 1 例項可繼承的屬性有 例項的建構函式的屬性,父類建構函式屬性,父類原型的屬性。新例項不會繼承父類例項的屬性!缺點 1 新例項無法向父類建構函式傳參。2 繼承單一。3 所有新例項都會共享父...

理解js繼承的6種方式

想要繼承,就必須要提供個父類 繼承誰,提供繼承的屬性 一 原型鏈繼承 重點 讓新例項的原型等於父類的例項。特點 1 例項可繼承的屬性有 例項的建構函式的屬性,父類建構函式屬性,父類原型的屬性。新例項不會繼承父類例項的屬性!缺點 1 新例項無法向父類建構函式傳參。2 繼承單一。3 所有新例項都會共享父...

js繼承的6種方式

想要繼承,就必須要提供個父類,繼承誰,提供繼承的屬性 function person name person.prototype.age 10 給建構函式新增了原型屬性function per per.prototype newperson var per1 newper console.log p...