本文歸納js中常見的幾種繼承方式。通過如下的對象作為示例的父對象:
1. 原型鏈繼承??
????子類的原型指向父類的實例來實現繼承:
? ? ? 優點:
? ? ? ? 1. 父類新增原型屬性或方法,子類可以訪問;
? ? ? ? 2. 簡單,容易實現
? ? ? 缺點:
? ? ? ? 1. 子類實例對象構建時,無法向父類構造函數傳參;
? ? ? ? 2. 只能繼承一個父類;
? ? ? ? 3. 所有子類實例都會繼承的父類實例屬性,這些繼承往往是多余的。
2. 借用構造函數
? ? 通過call或apply方法,調用父類構造函數實現繼承:
? ? 優點:
? ? ? ? 1. 允許向父類構造函數傳遞參數,繼承父類的屬性;
? ? ? ? 2. 可以通過調用多個父類對象實現一次繼承多個父類對象;
? ? 缺點:
? ? ? ? 1. 只能繼承父類的實例屬性,無法繼承原型屬性;
? ? ? ? 2. 每個子類的實例對象都需要調用一次父類對象方法達到繼承效果,影響性能;
3. 組合繼承(組合原型鏈繼承和復用構造函數繼承)
? ? 該方式組合以上兩種方式,實現繼承:
? ? 優點:
? ? ? ? 1. 繼承時運行想父類構造函數傳參;
? ? ? ? 2. 能夠繼承父類對象原型的屬性;
? ? 缺點:調用了2次父類構造函數,對性能有影響
4. 原型式繼承(共享原型)
? ? 該方式通過共享父類的原型實現繼承(該模式類似于通過Object.create()創建對象):
? ? 優點:只繼承父類對象的原型屬性,不繼承多余的父類對象屬性
? ? 缺點:修改子類對象的原型,父類對象的原型也會跟著修改
5. 圣杯模式
? ? 該模式通過一個繼承函數,實現繼承:
? ? 優點:
? ? ? ? 1. 完美的模式,只繼承父類對象的原型屬性,不繼承多余的父類對象實例屬性;
? ? ? ? 2. 修改子類對象的原型對象不會影響到父類對象的原型
? ? 缺點:無;
以上列舉了常見的幾種繼承方式,可能還有一些方式,不過都是相應的變形。