說到面向對象這個破玩意,曾經一度我都處于很懵逼的狀態,那么面向對象究竟是什么呢?其實說白了,所謂面向對象,就是基于類這個概念,來實現封裝、繼承和多態的一種編程思想罷了。今天我們就來說一下這其中繼承的問題。
好,先不直接上代碼,而是反手來一波文字說明,捋一捋思路。
曾經一段時間因為javascript關于類實現繼承的不規范,導致各種各樣實現繼承的代碼;而實際上不管代碼怎么變,繼承都基于兩種方式:
1.通過原型鏈,即子類的原型指向父類的實例從而實現原型共享。
2.借用構造函數,即通過js的apply、call實現子類調用父類的屬性、方法;
原型鏈方式可以實現所有屬性方法共享,但無法做到屬性、方法獨享(例如son1指向的是父類實例,son2,son3同樣如此,大家都是吃的同一碗飯);
而借用構造函數除了能獨享屬性、方法外還能在子類構造函數中傳遞參數,但代碼無法復用。總體而言就是可以實現所有屬性方法獨享,但無法做到屬性、方法共享(例如,son1新增了一個函數,然后想讓son2、son3一起用的話就無法實現了,只能son2,son3各自在構造函數中新增)。
組合繼承就是把以上兩種繼承方式一起使用,把共享的屬性、方法用原型鏈繼承實現,獨享的屬性、方法用借用構造函數實現,所以組合繼承幾乎完美實現了js的繼承;
為什么說是“幾乎”?因為后來人們發現組合繼承有一個小bug,實現的時候調用了兩次父類,性能上不合格啊有木有!怎么解決呢?于是“寄生繼承”就出來了。
簡單而言,寄生繼承就是不用實例化父類了,直接實例化一個臨時副本實現了相同的原型鏈繼承。(即子類的原型指向父類原型的副本),如此一來,這個問題就完美解決了。




