本文歸納js中常見的幾種繼承方式。通過如下的對(duì)象作為示例的父對(duì)象:
1. 原型鏈繼承??
????子類的原型指向父類的實(shí)例來實(shí)現(xiàn)繼承:
? ? ? 優(yōu)點(diǎn):
? ? ? ? 1. 父類新增原型屬性或方法训柴,子類可以訪問;
? ? ? ? 2. 簡(jiǎn)單足丢,容易實(shí)現(xiàn)
? ? ? 缺點(diǎn):
? ? ? ? 1. 子類實(shí)例對(duì)象構(gòu)建時(shí),無法向父類構(gòu)造函數(shù)傳參庇配;
? ? ? ? 2. 只能繼承一個(gè)父類斩跌;
? ? ? ? 3. 所有子類實(shí)例都會(huì)繼承的父類實(shí)例屬性,這些繼承往往是多余的讨永。
2. 借用構(gòu)造函數(shù)
? ? 通過call或apply方法滔驶,調(diào)用父類構(gòu)造函數(shù)實(shí)現(xiàn)繼承:
? ? 優(yōu)點(diǎn):
? ? ? ? 1. 允許向父類構(gòu)造函數(shù)傳遞參數(shù),繼承父類的屬性卿闹;
? ? ? ? 2. 可以通過調(diào)用多個(gè)父類對(duì)象實(shí)現(xiàn)一次繼承多個(gè)父類對(duì)象揭糕;
? ? 缺點(diǎn):
? ? ? ? 1. 只能繼承父類的實(shí)例屬性,無法繼承原型屬性锻霎;
? ? ? ? 2. 每個(gè)子類的實(shí)例對(duì)象都需要調(diào)用一次父類對(duì)象方法達(dá)到繼承效果著角,影響性能;
3. 組合繼承(組合原型鏈繼承和復(fù)用構(gòu)造函數(shù)繼承)
? ? 該方式組合以上兩種方式旋恼,實(shí)現(xiàn)繼承:
? ? 優(yōu)點(diǎn):
? ? ? ? 1. 繼承時(shí)運(yùn)行想父類構(gòu)造函數(shù)傳參吏口;
? ? ? ? 2. 能夠繼承父類對(duì)象原型的屬性;
? ? 缺點(diǎn):調(diào)用了2次父類構(gòu)造函數(shù)冰更,對(duì)性能有影響
4. 原型式繼承(共享原型)
? ? 該方式通過共享父類的原型實(shí)現(xiàn)繼承(該模式類似于通過Object.create()創(chuàng)建對(duì)象):
? ? 優(yōu)點(diǎn):只繼承父類對(duì)象的原型屬性产徊,不繼承多余的父類對(duì)象屬性
? ? 缺點(diǎn):修改子類對(duì)象的原型,父類對(duì)象的原型也會(huì)跟著修改
5. 圣杯模式
? ? 該模式通過一個(gè)繼承函數(shù)蜀细,實(shí)現(xiàn)繼承:
? ? 優(yōu)點(diǎn):
? ? ? ? 1. 完美的模式舟铜,只繼承父類對(duì)象的原型屬性,不繼承多余的父類對(duì)象實(shí)例屬性奠衔;
? ? ? ? 2. 修改子類對(duì)象的原型對(duì)象不會(huì)影響到父類對(duì)象的原型
? ? 缺點(diǎn):無谆刨;
以上列舉了常見的幾種繼承方式,可能還有一些方式归斤,不過都是相應(yīng)的變形痊夭。