1. 程式人生 > >Part 2 程式碼複用(繼承VS組合)

Part 2 程式碼複用(繼承VS組合)

談這個主題之前,我們先來聊聊程式碼複用,很多時候我們要複用一段程式碼時,發出的第一個吶喊就是“我要繼承!”。

但實際上把繼承的目的定為程式碼複用,本身就是一個錯誤的理解,那繼承到底是幹嘛的,往下看...


JS中是使用原型來模擬繼承的,如:

而繼承的真正目的是向上轉型實現多型 ,那麼什麼是多型,什麼是向上轉型?

多型:把“不變的”和“可變的”分開(把“做什麼”和“誰去做”分開),同一操作作用於不同的物件可以產生不同的執行結果,便於擴充套件。如:

 

上述例子中,所有的動物都會發聲 這是不變的

不同動物叫聲是不同的,把不同的部分以相同的介面封裝到各自的型別當中

向上轉型:當在一個類上給一個型別變數賦值時,這個變數的型別既可以是這個類本身的例項,也可以是這個類的超類(父類及以上)

如:Person p = new Student(); (Person是父類型別,Student是子類型別)

繼承、向上轉型、多型的關係是:繼承-->向上轉型-->多型 


在前端中,繼承多用於框架上,如元件生命週期:模板方法模式

在React中體現更明顯(本人還未接觸過React,摘來大神的code瞭解下)

 

所以說繼承並不是為了程式碼複用,那麼要程式碼複用怎麼做呢?

>>>組合

在vue中:mixin混入可以實現組合,即程式碼複用

缺點是改變了原有的物件,容易命名衝突,依賴不清 。


另外用到組合思想的還有函式式元件:指定部分引數來產生一個定製函式

 prop接收使用者配置,產生一個新的元件


此外瞭解下高階元件,另一個使用組合思想的方法:一個函式引數接收一個元件,返回一個新元件(React中便於實現,Vue比較困難)

 總結:在Vue中推薦研究混入和函式式元件