js的六種繼承方法理論
javascript繼承的6種方法:
1、原型鏈繼承,其重點是讓新例項的原型等於父類的例項
重點:讓新例項的原型等於父類的例項。
特點:1、例項可繼承的屬性有:例項的建構函式的屬性,父類建構函式屬性,父類原型的屬性。(新例項不會繼承父類例項的屬性!)
缺點:1、新例項無法向父類建構函式傳參。
2、繼承單一。
3、所有新例項都會共享父類例項的屬性。(原型上的屬性是共享的,一個例項修改了原型屬性,另一個例項的原型屬性也會被修改!)
2、借用建構函式繼承(也稱偽造物件或經典繼承)
重點:用.call()和.apply()將父類建構函式引入子類函式(在子類函式中做了父類函式的自執行(複製))
特點:1、只繼承了父類建構函式的屬性,沒有繼承父類原型的屬性。
2、解決了原型鏈繼承缺點1、2、3。
3、可以繼承多個建構函式屬性(call多個)。
4、在子例項中可向父例項傳參。
缺點:1、只能繼承父類建構函式的屬性。
2、無法實現建構函式的複用。(每次用每次都要重新呼叫)
3、每個新例項都有父類建構函式的副本,臃腫。
3、組合繼承(組合原型鏈繼承和借用建構函式繼承)
重點:結合了兩種模式的優點,傳參和複用
特點:1、可以繼承父類原型上的屬性,可以傳參,可複用。
2、每個新例項引入的建構函式屬性是私有的。
缺點:呼叫了兩次父類建構函式(耗記憶體),子類的建構函式會代替原型上的那個父類建構函式。
4、原型式繼承
重點:結合了兩種模式的優點,傳參和複用
特點:1、可以繼承父類原型上的屬性,可以傳參,可複用。
2、每個新例項引入的建構函式屬性是私有的。
缺點:呼叫了兩次父類建構函式(耗記憶體),子類的建構函式會代替原型上的那個父類建構函式。
5、寄生式繼承
重點:就是給原型式繼承外面套了個殼子。
優點:沒有建立自定義型別,因為只是套了個殼子返回物件(這個),這個函式順理成章就成了建立的新物件。
缺點:沒用到原型,無法複用。
6、寄生組合式繼承
寄生:在函式內返回物件然後呼叫
組合:1、函式的原型等於另一個例項。2、在函式中用apply或者call引入另一個建構函式,可傳參
重點:修復了組合繼承的問題