js繼承的幾種方法

ES5 有 6 種方式可以實(shí)現(xiàn)繼承,分別為:

1. 原型鏈繼承

原型鏈繼承的基本思想是利用原型讓一個引用類型繼承另一個引用類型的屬性和方法舆床。

image

缺點(diǎn):

  1. 該原型的引用類型屬性會被所有的實(shí)例共享蟀给。

  2. 無法給父類構(gòu)造函數(shù)傳參瓮增。

2. 借用構(gòu)造函數(shù)

借用構(gòu)造函數(shù)的技術(shù)巩步,其基本思想為:

在子類型的構(gòu)造函數(shù)中使用call()apply()方法調(diào)用超類型構(gòu)造函數(shù)。

image

優(yōu)點(diǎn):

  1. 可以向超類傳遞參數(shù)

  2. 解決了原型中包含引用類型值被所有實(shí)例共享的問題

缺點(diǎn):

  1. 方法都在構(gòu)造函數(shù)中定義愉阎,無法實(shí)現(xiàn)函數(shù)的復(fù)用
  2. 超類型原型中定義的方法對于子類型而言都是不可見的绞蹦,所以無法繼承原型上的屬性和方法。
3. 組合繼承(原型鏈 + 借用構(gòu)造函數(shù))

組合繼承指的是將原型鏈和借用構(gòu)造函數(shù)技術(shù)組合到一塊榜旦,從而發(fā)揮二者之長的一種繼承模式幽七。基本思路:

使用原型鏈實(shí)現(xiàn)對原型屬性和方法的繼承溅呢,通過借用構(gòu)造函數(shù)來實(shí)現(xiàn)對實(shí)例屬性的繼承澡屡,既通過在原型上定義方法來實(shí)現(xiàn)了函數(shù)復(fù)用,又保證了每個實(shí)例都有自己的屬性咐旧。

image

缺點(diǎn):

  • 無論什么情況下驶鹉,都會調(diào)用兩次超類型構(gòu)造函數(shù):一次是在創(chuàng)建子類型原型的時候,另一次是在子類型構(gòu)造函數(shù)內(nèi)部铣墨。

優(yōu)點(diǎn):

  • 可以向超類傳遞參數(shù)

  • 每個實(shí)例都有自己的屬性

  • 實(shí)現(xiàn)了函數(shù)復(fù)用

4. 原型式繼承

原型繼承的基本思想:

借助原型可以基于已有的對象創(chuàng)建新對象室埋,同時還不必因此創(chuàng)建自定義類型。

image

object() 函數(shù)內(nèi)部伊约,先創(chuàng)建一個臨時性的構(gòu)造函數(shù)姚淆,然后將傳入的對象作為這個構(gòu)造函數(shù)的原型,最后返回了這個臨時類型的一個新實(shí)例屡律,從本質(zhì)上講肉盹, object() 對傳入的對象執(zhí)行了一次淺拷貝。

ECMAScript6通過新增 Object.create()方法規(guī)范了原型式繼承疹尾。這個方法接收兩個參數(shù):一個用作新對象原型的對象和(可選的)一個為新對象定義額外屬性的對象(可以覆蓋原型對象上的同名屬性)上忍,在傳入一個參數(shù)的情況下, Object.create()object() 方法的行為相同纳本。

image

在沒有必要創(chuàng)建構(gòu)造函數(shù)窍蓝,僅讓一個對象與另一個對象保持相似的情況下,原型式繼承是可以勝任的繁成。

缺點(diǎn):

同原型鏈實(shí)現(xiàn)繼承一樣吓笙,包含引用類型值的屬性會被所有實(shí)例共享。

5. 寄生式繼承

寄生式繼承是與原型式繼承緊密相關(guān)的一種思路巾腕。寄生式繼承的思路與寄生構(gòu)造函數(shù)和工廠模式類似面睛,即創(chuàng)建一個僅用于封裝繼承過程的函數(shù),該函數(shù)在內(nèi)部已某種方式來增強(qiáng)對象尊搬,最后再像真地是它做了所有工作一樣返回對象叁鉴。

image

基于 person 返回了一個新對象 -—— person2,新對象不僅具有 person 的所有屬性和方法佛寿,而且還有自己的 sayHi() 方法幌墓。在考慮對象而不是自定義類型和構(gòu)造函數(shù)的情況下,寄生式繼承也是一種有用的模式。

缺點(diǎn):

  • 使用寄生式繼承來為對象添加函數(shù)常侣,會由于不能做到函數(shù)復(fù)用而效率低下蜡饵。

  • 同原型鏈實(shí)現(xiàn)繼承一樣,包含引用類型值的屬性會被所有實(shí)例共享胳施。

6. 寄生組合式繼承

所謂寄生組合式繼承溯祸,即通過借用構(gòu)造函數(shù)來繼承屬性,通過原型鏈的混成形式來繼承方法舞肆,基本思路:

不必為了指定子類型的原型而調(diào)用超類型的構(gòu)造函數(shù)焦辅,我們需要的僅是超類型原型的一個副本,本質(zhì)上就是使用寄生式繼承來繼承超類型的原型胆绊,然后再將結(jié)果指定給子類型的原型。寄生組合式繼承的基本模式如下所示:

image
  • 第一步:創(chuàng)建超類型原型的一個副本

  • 第二步:為創(chuàng)建的副本添加 constructor 屬性

  • 第三步:將新創(chuàng)建的對象賦值給子類型的原型

至此欧募,我們就可以通過調(diào)用 inheritPrototype 來替換為子類型原型賦值的語句:

image

優(yōu)點(diǎn):

只調(diào)用了一次超類構(gòu)造函數(shù)压状,效率更高。避免在 SuberType.prototype上面創(chuàng)建不必要的跟继、多余的屬性种冬,與其同時,原型鏈還能保持不變舔糖。

因此寄生組合繼承是引用類型最理性的繼承范式娱两。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市金吗,隨后出現(xiàn)的幾起案子十兢,更是在濱河造成了極大的恐慌,老刑警劉巖摇庙,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旱物,死亡現(xiàn)場離奇詭異,居然都是意外死亡卫袒,警方通過查閱死者的電腦和手機(jī)宵呛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夕凝,“玉大人宝穗,你說我怎么就攤上這事÷氡” “怎么了逮矛?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長转砖。 經(jīng)常有香客問我橱鹏,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任莉兰,我火速辦了婚禮挑围,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘糖荒。我一直安慰自己杉辙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布捶朵。 她就那樣靜靜地躺著蜘矢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪综看。 梳的紋絲不亂的頭發(fā)上品腹,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音红碑,去河邊找鬼舞吭。 笑死,一個胖子當(dāng)著我的面吹牛析珊,可吹牛的內(nèi)容都是我干的羡鸥。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼忠寻,長吁一口氣:“原來是場噩夢啊……” “哼惧浴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起奕剃,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤衷旅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后纵朋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芜茵,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年倡蝙,在試婚紗的時候發(fā)現(xiàn)自己被綠了九串。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡寺鸥,死狀恐怖猪钮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情胆建,我是刑警寧澤烤低,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站笆载,受9級特大地震影響扑馁,放射性物質(zhì)發(fā)生泄漏涯呻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一腻要、第九天 我趴在偏房一處隱蔽的房頂上張望复罐。 院中可真熱鬧,春花似錦雄家、人聲如沸效诅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乱投。三九已至,卻和暖如春顷编,著一層夾襖步出監(jiān)牢的瞬間戚炫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工媳纬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留双肤,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓层宫,卻偏偏與公主長得像杨伙,于是被迫代替她去往敵國和親其监。 傳聞我的和親對象是個殘疾皇子萌腿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容