年前最后一天班做一點(diǎn)干貨輸出吧季俩,從class聊聊繼承

我們?nèi)粘i_發(fā)都會(huì)用到ES6, 比如我們擼React昼蛀,寫組件肯定擼過class XX extends React.Component. constructor(){super(xx)}之類的棕兼。
今天就來看看這個(gè)class陡舅,我們知道JS里本身是沒有class這個(gè)概念,其他語言比如java伴挚,python是天生就有class的靶衍,JS肯定不服啊,所以在ES6里就引入了class茎芋,那么是class就真的是class嗎颅眶?No,此class非彼class田弥,用的babel的同學(xué)肯定會(huì)知道涛酗,當(dāng)我們打開編譯后的es6代碼,實(shí)際就是es5偷厦,里面并沒有class商叹,還是prototype什么那些一堆亂七八糟的玩意兒,說白了只泼,class只是一個(gè)語法糖剖笙,方便我們開發(fā)寫代碼而已。
好辜妓,那我們就來看看什么是真正的繼承吧枯途。
Type 1: 原型鏈的方式可以實(shí)現(xiàn)忌怎,talk is cheap, show me the code.亮代碼

  function Taylor () {
        this.name = 'Taylor'
        this.price = 7777
   }
  function Guitar () {
    this.dalao= '雨神'
  }

  Taylor.prototype = new Guitar()

  const guitar = new Taylor()

我想買一把吉他,吉他有很多品牌酪夷,比如泰勒馬丁雅馬哈各種榴啸,精挑細(xì)選最后看中了泰勒這個(gè)吉他品牌,就先定義一個(gè)子類叫泰勒晚岭,接著我們定義父類就是Guitar鸥印。
接下來就是關(guān)鍵的一步,Taylor.prototype = new Guitar()坦报,將Guitar的實(shí)例賦給Taylor的顯式原型prototype,這樣就完成了最基本的原型鏈繼承库说。我們可以來試一下,再控制臺(tái)輸入以上代碼并執(zhí)行片择,然后
console.log(guitar.dalao)控制臺(tái)會(huì)輸出雨神大佬潜的,在Taylor的定義里并沒有dalao的屬性,而現(xiàn)在我們卻可以輸出dalao這個(gè)屬性字管,就是通過原型鏈找到的啰挪,這就說明Taylor繼承了Guitar,也說明了雨神不僅是泰勒dalao嘲叔,不管任何品牌吉他的都是dalao,是我等菜雞膜拜的大神亡呵。
好了,言歸正傳硫戈,這種原型鏈的方式也有缺點(diǎn)锰什,比如如果父類的屬性是一個(gè)引用類型,在一個(gè)子類實(shí)例中修改了這個(gè)屬性之后新創(chuàng)建的子類實(shí)例也會(huì)被永久修改了丁逝。還有就是不能直接給父類構(gòu)造函數(shù)傳參汁胆,因?yàn)闀?huì)影響新建實(shí)例對(duì)象。

Type 2: 構(gòu)造函數(shù)的方式可以實(shí)現(xiàn)果港,talk is cheap, show me the code.亮代碼

 function Guitar (name) {
    this.dalao= name
    this.songs = []
  }
  function Taylor (dalao) {
    this.name = 'Taylor'
    this.price = 7777
    Guitar.call(this, dalao)
  }
  const guitar = new Taylor('雨神')

和上面一樣沦泌,我們改成構(gòu)造函數(shù)的方式實(shí)現(xiàn)繼承,關(guān)鍵的一步辛掠,Guitar.call(this, '雨神')谢谦,改變了父類Guitar的執(zhí)行上下文this指向,讓this指向子類萝衩,換句話說就是把父類構(gòu)造函數(shù)在子類構(gòu)造函數(shù)里執(zhí)行一遍回挽。而且解決了之前原型鏈繼承存在的問題,一個(gè)就是不能直接父類構(gòu)造函數(shù)傳參猩谊,我們給Guitar定義了一個(gè)形參name千劈,在new Taylor('雨神')里我們傳入雨神這個(gè)實(shí)參,然后我們和上面一樣在控制臺(tái)輸出console.log(guitar.dalao)控制臺(tái)也一樣會(huì)輸出雨神大佬牌捷,然后我們可以做下改動(dòng)墙牌,Guitar.call(this, '小老弟60')涡驮,重復(fù)上面步驟,控制臺(tái)會(huì)輸出'小老弟60'.
第二個(gè)問題就是父類引用類型屬性喜滨,我這里放了了一個(gè)songs=[]一個(gè)空數(shù)組捉捅。然后我們給guitar實(shí)例的songs做加點(diǎn)東西。
guitar.songs.push('盜將行')我們年會(huì)表演的曲子虽风,很好聽的棒口,強(qiáng)烈推薦,沒聽過可以試試辜膝。然后我們新建一個(gè)Taylor的實(shí)例无牵,const guitar222= new Taylor() console.log(guitar222.songs)
控制臺(tái)輸出一個(gè)[],發(fā)現(xiàn)之前我們的操作并沒有影響到后來新建的實(shí)例對(duì)象厂抖,這就解決了原型鏈的兩個(gè)缺點(diǎn)茎毁,當(dāng)然構(gòu)造函數(shù)模式 也有缺點(diǎn),就是父類原型里定義的屬性子類是無法繼承的忱辅。
所以充岛,我們?nèi)∑渚A去其糟粕,把二者合二為一耕蝉,誕生了第三種繼承方式,組合繼承夜只,就是把原型鏈和構(gòu)造函數(shù)組合在一起實(shí)現(xiàn)繼承垒在。
Type 3: 組合繼承的方式可以實(shí)現(xiàn),talk is cheap, show me the code.亮代碼

  function Guitar (name) {
    this.dalao= name
    this.songs = []
  }

  function Taylor (dalao) {
    this.name = 'Taylor'
    this.price = 7777
    Guitar.call(this, dalao)
  }
Guitar.prototype.band = 'HikWestlife'

Taylor.prototype = new Guitar()
Taylor.prototype.constructor = Taylor

const guitar = new Taylor('雨神')

這就是組合繼承扔亥,同時(shí)我們把Taylor.prototype.constructor的構(gòu)造器指向Taylor场躯。然而還是不夠完美,因?yàn)楦割惖臉?gòu)造函數(shù)執(zhí)行了兩次旅挤,為了更好的性能踢关,我們發(fā)明了終極解放方案,寄生組合式繼承粘茄。

Type 4: 寄生繼承的方式可以實(shí)現(xiàn)签舞,talk is cheap, show me the code.亮代碼

  function Guitar (name) {
    this.dalao= name
    this.songs = []
  }

  function Taylor (dalao) {
    this.name = 'Taylor'
    this.price = 7777
    Guitar.call(this, dalao)
  }
Guitar.prototype.band = 'HikWestlife'

Taylor.prototype = Object.create(Guitar.prototype)
Taylor.prototype.constructor = Taylor

const guitar = new Taylor('雨神')

一起來試驗(yàn)一下,我們?cè)诳刂婆_(tái)輸出console.log(guitar.band)發(fā)現(xiàn)會(huì)輸出"HikWestlife"柒瓣,一樣實(shí)現(xiàn)了組合繼承的功能儒搭,而且還只執(zhí)行了一次構(gòu)造函數(shù)。
好了芙贫,這就是class的真面目搂鲫,放假了。磺平。過年~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末魂仍,一起剝皮案震驚了整個(gè)濱河市拐辽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌擦酌,老刑警劉巖俱诸,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異仑氛,居然都是意外死亡乙埃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門锯岖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來介袜,“玉大人,你說我怎么就攤上這事出吹∮錾。” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵捶牢,是天一觀的道長(zhǎng)鸠珠。 經(jīng)常有香客問我,道長(zhǎng)秋麸,這世上最難降的妖魔是什么渐排? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮灸蟆,結(jié)果婚禮上驯耻,老公的妹妹穿的比我還像新娘。我一直安慰自己炒考,他們只是感情好可缚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著斋枢,像睡著了一般帘靡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瓤帚,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天描姚,我揣著相機(jī)與錄音,去河邊找鬼缘滥。 笑死轰胁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的朝扼。 我是一名探鬼主播赃阀,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了榛斯?” 一聲冷哼從身側(cè)響起观游,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎驮俗,沒想到半個(gè)月后懂缕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡王凑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年搪柑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片索烹。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡工碾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出百姓,到底是詐尸還是另有隱情渊额,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布垒拢,位于F島的核電站旬迹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏求类。R本人自食惡果不足惜奔垦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尸疆。 院中可真熱鬧宴倍,春花似錦、人聲如沸仓技。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)脖捻。三九已至,卻和暖如春兆衅,著一層夾襖步出監(jiān)牢的瞬間地沮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工羡亩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摩疑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓畏铆,卻偏偏與公主長(zhǎng)得像雷袋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辞居,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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