捋一捋js面向对象的继承问题
說到面向對象這個破玩意,曾經(jīng)一度我都處于很懵逼的狀態(tài),那么面向對象究竟是什么呢?其實說白了,所謂面向對象,就是基于類這個概念,來實現(xiàn)封裝、繼承和多態(tài)的一種編程思想罷了。今天我們就來說一下這其中繼承的問題。
好,先不直接上代碼,而是反手來一波文字說明,捋一捋思路。
曾經(jīng)一段時間因為javascript關于類實現(xiàn)繼承的不規(guī)范,導致各種各樣實現(xiàn)繼承的代碼;而實際上不管代碼怎么變,繼承都基于兩種方式:
1.通過原型鏈,即子類的原型指向父類的實例從而實現(xiàn)原型共享。
2.借用構造函數(shù),即通過js的apply、call實現(xiàn)子類調(diào)用父類的屬性、方法;
原型鏈方式可以實現(xiàn)所有屬性方法共享,但無法做到屬性、方法獨享(例如son1指向的是父類實例,son2,son3同樣如此,大家都是吃的同一碗飯);
而借用構造函數(shù)除了能獨享屬性、方法外還能在子類構造函數(shù)中傳遞參數(shù),但代碼無法復用。總體而言就是可以實現(xiàn)所有屬性方法獨享,但無法做到屬性、方法共享(例如,son1新增了一個函數(shù),然后想讓son2、son3一起用的話就無法實現(xiàn)了,只能son2,son3各自在構造函數(shù)中新增)。
組合繼承就是把以上兩種繼承方式一起使用,把共享的屬性、方法用原型鏈繼承實現(xiàn),獨享的屬性、方法用借用構造函數(shù)實現(xiàn),所以組合繼承幾乎完美實現(xiàn)了js的繼承;
為什么說是“幾乎”?因為后來人們發(fā)現(xiàn)組合繼承有一個小bug,實現(xiàn)的時候調(diào)用了兩次父類,性能上不合格啊有木有!怎么解決呢?于是“寄生繼承”就出來了。
簡單而言,寄生繼承就是不用實例化父類了,直接實例化一個臨時副本實現(xiàn)了相同的原型鏈繼承。(即子類的原型指向父類原型的副本),如此一來,這個問題就完美解決了。
接下來是代碼部分: 這里我們通過apply方法給兒子傳了私有屬性,但是父類原型上的方法是無法調(diào)用的。 然后我們試試通過原型鏈來實現(xiàn)繼承。 這樣一來就把父類的全部東西都一股腦繼承下來了,而且我這里如果Sons修改了父類的原型,其他跟著用的比如Daughters也要跟著遭殃。 而組合繼承這時候就出來了,組合繼承就是把以上兩種繼承方式一起使用,把共享的屬性、方法用原型鏈繼承實現(xiàn);獨享的屬性、方法用借用構造函數(shù)實現(xiàn)。至于寄生組合繼承,它是為了解決組合繼承會二次調(diào)用父類這個bug出現(xiàn)的優(yōu)化方法,具體實現(xiàn)如下: 在這一步,無論是兒子還是女兒,都能成功調(diào)用父類的公用方法。接著在末尾添加兩行代碼往下看: 兩個say方法雖然同名,卻互不影響。最后調(diào)用父類的私有屬性看看: 只有兒子利用私有屬性拿到了secret,而女兒沒有拿到,完美解決共享與獨享分配的問題!
轉載于:https://www.cnblogs.com/zhangnan35/p/8473061.html
總結
以上是生活随笔為你收集整理的捋一捋js面向对象的继承问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全栈自研!小米首款人形机器人Cybero
- 下一篇: 《海贼王:FILM RED》剧场版票房破