理解js繼承的6種方式

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

    

  1、原型鏈繼承函數

    

    重點:讓新實例的原型等於父類的實例。學習

    特色:一、實例可繼承的屬性有:實例的構造函數的屬性,父類構造函數屬性,父類原型的屬性。(新實例不會繼承父類實例的屬性!)spa

    缺點:一、新實例沒法向父類構造函數傳參。3d

       二、繼承單一。對象

       三、全部新實例都會共享父類實例的屬性。(原型上的屬性是共享的,一個實例修改了原型屬性,另外一個實例的原型屬性也會被修改!)blog

  

  2、借用構造函數繼承繼承

    

    重點:用.call()和.apply()將父類構造函數引入子類函數(在子類函數中作了父類函數的自執行(複製))內存

    特色:一、只繼承了父類構造函數的屬性,沒有繼承父類原型的屬性。原型鏈

       二、解決了原型鏈繼承缺點一、二、3。

       三、能夠繼承多個構造函數屬性(call多個)。

       四、在子實例中可向父實例傳參。

    缺點:一、只能繼承父類構造函數的屬性。

       二、沒法實現構造函數的複用。(每次用每次都要從新調用)

       三、每一個新實例都有父類構造函數的副本,臃腫。

 

  3、組合繼承(組合原型鏈繼承和借用構造函數繼承)(經常使用)

    

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

    特色:一、能夠繼承父類原型上的屬性,能夠傳參,可複用。

       二、每一個新實例引入的構造函數屬性是私有的。

    缺點:調用了兩次父類構造函數(耗內存),子類的構造函數會代替原型上的那個父類構造函數。

 

  4、原型式繼承

    

    重點:用一個函數包裝一個對象,而後返回這個函數的調用,這個函數就變成了個能夠隨意增添屬性的實例或對象。object.create()就是這個原理。

    特色:相似於複製一個對象,用函數來包裝。

    缺點:一、全部實例都會繼承原型上的屬性。

       二、沒法實現複用。(新實例屬性都是後面添加的)

  

  5、寄生式繼承

    

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

    優勢:沒有建立自定義類型,由於只是套了個殼子返回對象(這個),這個函數瓜熟蒂落就成了建立的新對象。

    缺點:沒用到原型,沒法複用。

    

  6、寄生組合式繼承(經常使用)

    寄生:在函數內返回對象而後調用

    組合:一、函數的原型等於另外一個實例。二、在函數中用apply或者call引入另外一個構造函數,可傳參 

     

  

    

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

 

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

    這些繼承模式的學習重點是學它們的思想,否則你會在coding書本上的例子的時候,會以爲明明能夠直接繼承爲何還要搞這麼麻煩。就像原型式繼承它用函數複製了內部對象的一個副本,這樣不只能夠繼承內部對象的屬性,還能把函數(對象,來源內部對象的返回)隨意調用,給它們添加屬性,改個參數就能夠改變原型對象,而這些新增的屬性也不會相互影響。

相關文章
相關標籤/搜索