本文歸納js中常見(jiàn)的幾種繼承方式。通過(guò)如下的對(duì)象作為示例的父對(duì)象:

1. 原型鏈繼承??
????子類的原型指向父類的實(shí)例來(lái)實(shí)現(xiàn)繼承:

? ? ? 優(yōu)點(diǎn):
? ? ? ? 1. 父類新增原型屬性或方法,子類可以訪問(wèn);
? ? ? ? 2. 簡(jiǎn)單,容易實(shí)現(xiàn)
? ? ? 缺點(diǎn):
? ? ? ? 1. 子類實(shí)例對(duì)象構(gòu)建時(shí),無(wú)法向父類構(gòu)造函數(shù)傳參;
? ? ? ? 2. 只能繼承一個(gè)父類;
? ? ? ? 3. 所有子類實(shí)例都會(huì)繼承的父類實(shí)例屬性,這些繼承往往是多余的。
2. 借用構(gòu)造函數(shù)
? ? 通過(guò)call或apply方法,調(diào)用父類構(gòu)造函數(shù)實(shí)現(xiàn)繼承:

? ? 優(yōu)點(diǎn):
? ? ? ? 1. 允許向父類構(gòu)造函數(shù)傳遞參數(shù),繼承父類的屬性;
? ? ? ? 2. 可以通過(guò)調(diào)用多個(gè)父類對(duì)象實(shí)現(xiàn)一次繼承多個(gè)父類對(duì)象;
? ? 缺點(diǎn):
? ? ? ? 1. 只能繼承父類的實(shí)例屬性,無(wú)法繼承原型屬性;
? ? ? ? 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. 原型式繼承(共享原型)
? ? 該方式通過(guò)共享父類的原型實(shí)現(xiàn)繼承(該模式類似于通過(guò)Object.create()創(chuàng)建對(duì)象):

? ? 優(yōu)點(diǎn):只繼承父類對(duì)象的原型屬性,不繼承多余的父類對(duì)象屬性
? ? 缺點(diǎn):修改子類對(duì)象的原型,父類對(duì)象的原型也會(huì)跟著修改
5. 圣杯模式
? ? 該模式通過(guò)一個(gè)繼承函數(shù),實(shí)現(xiàn)繼承:

? ? 優(yōu)點(diǎn):
? ? ? ? 1. 完美的模式,只繼承父類對(duì)象的原型屬性,不繼承多余的父類對(duì)象實(shí)例屬性;
? ? ? ? 2. 修改子類對(duì)象的原型對(duì)象不會(huì)影響到父類對(duì)象的原型
? ? 缺點(diǎn):無(wú);
以上列舉了常見(jiàn)的幾種繼承方式,可能還有一些方式,不過(guò)都是相應(yīng)的變形。