JS繼承的六種方式app
經過使用call、apply方法能夠在新建立的對象上執行構造函數,用父類的構造函數來增長子類的實例,以此實現繼承。函數
具體實現:3d
優勢:簡單明瞭,直接繼承超類構造函數的屬性和方法對象
缺點:在子實例中會拷貝父類構造函數中的方法,當子類不少的時候,會增長內存的佔用量,而且當實例須要改變方法的時候,以前的實例都沒法及時更新,沒法繼承原型鏈上的屬性和方法blog
利用原型鏈來實現繼承,超類的一個實例做爲子類的原型,聲明一個過渡的函數對象,將傳入的須要繼承的函數賦值給過渡函數的對象繼承
具體實現:內存
當c訪問b的superSpeak屬性的時候,會先在c的實例屬性中查找,沒有找到,以後到b的原型即a的實例中去找,仍是沒有找到,繼續到a的原型對象中找。原型鏈
優勢:原型
實例是子類的實例,實際上也是父類的一個實例模板
父類新增原型方法/原型屬性,子類都能訪問到
缺點:
全部子類的實例的原型都共享一個超類實例的屬性和方法,沒法實現多繼承
雖然原型上任何類型的屬性值都不會經過實例被重寫,可是引用類型的屬性值可能會受到影響。
好比:
利用構造繼承和原型鏈組合
具體實現:
優勢:解決了構造繼承和原型鏈繼承的兩個問題
缺點:實際上子類上會擁有超類的兩個屬性(上圖的第12行和第15行),多佔用了一點兒內存,只是子類的屬性覆蓋了超類的屬性
採用原型式繼承並不須要定義一個類,本質上是淺拷貝,以一個對象爲模板複製出新的對象因此引用的數據共享在不一樣的實例間。
具體實現:
當d修改引用對象時,e的數據也會發生變化。
多用於不構建構造函數,僅僅模擬一個對象的時候。
優勢:直接經過一個對象生成一個繼承該對象的對象
缺點:不是類式繼承,而是原型式基礎,缺乏了類的概念
建立一個僅僅用於封裝繼承過程的函數,而後在內部以某種方式加強對象,最後返回對象
具體實現:
優勢:把原型式繼承再次封裝,而後在對象上擴展新得方法,再把新對象返回
缺點:依舊沒有類的概念
結合寄生式繼承和組合式繼承,完美實現不帶兩份超類屬性的繼承方式
具體實現:
優勢:完美實現繼承,解決了組合式繼承帶兩份屬性的問題
缺點:過於繁瑣,所以組合繼承更好一些
哈哈哈,未完待續...