用白話講解JS中的繼承核心

【前言】

近來因為講課需要赫舒,涉及到使用JavaScript中的繼承翼馆,但發(fā)現(xiàn)遇上不懂的同學(xué),無法用一句話帶過启具,因為周邊涉及的知識點比較多本讥,因此決定系統(tǒng)的來說一說,我先簡單用一點圖來描述什么是繼承富纸。(不懂的同學(xué)可以先忽略英文)

請先忽略prototype等看不懂的單詞囤踩,可以看到祖宗改變就能影響后代,這樣也就讓我們能改一處晓褪,多出發(fā)生變化,減輕了工作量综慎,提高了效率涣仿。

【繼承的思路】

總的來說繼承可以理解為設(shè)置屬性或功能的多復(fù)用,那么大致有2條路子實現(xiàn)該功能。

1:祖宗構(gòu)造函數(shù)的原型好港,其是創(chuàng)建對象時參照的模板愉镰,所有實例共享該原型對象的是屬性及函數(shù)。

2:祖宗構(gòu)造函數(shù)本身的復(fù)用钧汹,在子孫構(gòu)造函數(shù)內(nèi)部調(diào)用祖宗的構(gòu)造函數(shù)丈探,因此執(zhí)行了祖宗的構(gòu)造方法,從而子孫享有祖宗構(gòu)造過程拔莱。

【構(gòu)造函數(shù)繼承】

重點就是子類調(diào)用父類構(gòu)造函數(shù)來創(chuàng)建對象

// 人類functionPeople(){this.description ='人類';}// 學(xué)生functionStudent(){// 調(diào)用People函數(shù)碗降,改變this指向People.call(this);}vars =newStudent();s.description;// 人類

【原型繼承】

重點是子類使用父類原型來共享

// 人類functionPeople(){}People.prototype.description ='人類';varp =newPeople();// 學(xué)生functionStudent(){}// 原型繼承Student.prototype = People.prototype;vars =newStudent();s.description;// 人類p.description;// 人類

【出現(xiàn)問題】

我們看到上面例子會帶來一個很簡單的問題,那就是 Student.prototype和People.prototype是同一個原型塘秦,當我們?nèi)ジ膭尤魏我粋€原型的時候讼渊,將會影響Student和People的實例。試想People改動影響Student也許我們覺得還ok尊剔,可是反之爪幻,就感覺不對了。

【原型:父類實例繼承】

我們知道 new 父類()得到的結(jié)果是和父類原型息息相關(guān)的须误,因此為了避免Student.prototype和People.prototype是同一個對象挨稿,而new People()創(chuàng)建的對象是根據(jù)People.prototype來的,所以我們用一個父類的實例來代替原型京痢,從而避免上述問題

// 人類functionPeople(){}People.prototype.description ='人類';// 學(xué)生functionStudent(){}// 原型繼承Student.prototype =newPeople();vars =newStudent();s.description;// 人類

【組合繼承】

但同時叶组,我們需要父類構(gòu)造函數(shù)的執(zhí)行獲取其他屬性,就需要使用到組合繼承的方式了历造,也就是【原型繼承】+【構(gòu)造函數(shù)繼承】

// 人類functionPeople(newProps){this.newProps = newProps;}People.prototype.description ='人類';// 學(xué)生functionStudent(){// 調(diào)用父類構(gòu)造函數(shù)People.call(this);}// 原型繼承Student.prototype =newPeople();vars =newStudent();s.description;// 人類s.newProps;// xxx

這里稍有不慎你可能會看到

都是因為沒有傳遞參數(shù)的問題甩十,那原型上這個undefine顯得不好看,而我們傳遞該值又顯得沒有意義吭产,從內(nèi)存角度來說侣监,我們只是需要原型而不是需要走構(gòu)造函數(shù)呀。

【新建對象繼承】

// 人類functionPeople(newProps){this.newProps = newProps;}People.prototype.description ='人類';// 學(xué)生functionStudent(){// 調(diào)用父類構(gòu)造函數(shù)People.call(this);}// 原型繼承Student.prototype =Object.create(People.Prototype);vars =newStudent();s.description;// 人類s.newProps;// xxx

【總結(jié)】

JS中的繼承主要分為兩條線即兩種思路:

根據(jù)父類構(gòu)造函數(shù)

根據(jù)原型

由于僅靠構(gòu)造函數(shù)構(gòu)造出的實例臣淤,我們針對方法不太會使用this.fn = function(){}來浪費內(nèi)存橄霉,因此會使用到原型,而原型又存在相同對象指向的問題邑蒋,因此創(chuàng)建一個新的對象姓蜂,然后新對象可能需要參數(shù),會導(dǎo)致子類原型看起來不好看医吊,這樣我們使用Object.create(父類原型)钱慢,同時,如果父類構(gòu)造函數(shù)內(nèi)的屬性我們需要卿堂,那么還需要組合起來調(diào)用束莫。

推薦學(xué)習(xí):Web職場加油班——JS精講:http://xue.ujiuye.com/class-102355/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末懒棉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子览绿,更是在濱河造成了極大的恐慌策严,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饿敲,死亡現(xiàn)場離奇詭異妻导,居然都是意外死亡,警方通過查閱死者的電腦和手機怀各,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門倔韭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人渠啤,你說我怎么就攤上這事狐肢。” “怎么了沥曹?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵份名,是天一觀的道長。 經(jīng)常有香客問我妓美,道長僵腺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任壶栋,我火速辦了婚禮辰如,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贵试。我一直安慰自己琉兜,他們只是感情好,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布毙玻。 她就那樣靜靜地躺著豌蟋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桑滩。 梳的紋絲不亂的頭發(fā)上梧疲,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音运准,去河邊找鬼幌氮。 笑死,一個胖子當著我的面吹牛胁澳,可吹牛的內(nèi)容都是我干的该互。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼听哭,長吁一口氣:“原來是場噩夢啊……” “哼慢洋!你這毒婦竟也來了塘雳?” 一聲冷哼從身側(cè)響起陆盘,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤普筹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后隘马,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體太防,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年酸员,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜒车。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡幔嗦,死狀恐怖酿愧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情邀泉,我是刑警寧澤嬉挡,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布挽拔,位于F島的核電站邓了,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏褪尝。R本人自食惡果不足惜因谎,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一基括、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧财岔,春花似錦风皿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至患朱,卻和暖如春鲁僚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背裁厅。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工冰沙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人执虹。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓拓挥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親袋励。 傳聞我的和親對象是個殘疾皇子侥啤,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

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

  • avaScript對每個創(chuàng)建的對象都會設(shè)置一個原型当叭,指向它的原型對象。 當我們用obj.xxx訪問一個對象的屬性時...
    源大俠閱讀 253評論 0 1
  • 我們在對象創(chuàng)建模式中討論過盖灸,對象創(chuàng)建的模式就是定義對象模板的方式蚁鳖。有了模板以后,我們就可以輕松地創(chuàng)建多個結(jié)構(gòu)相同的...
    csRyan閱讀 884評論 0 7
  • 其實要總結(jié)這幾個概念已經(jīng)很久了赁炎,只是之前一直都覺得自己還不算完全掌握醉箕,而且知識點還不夠系統(tǒng),所以一直拖著徙垫,但是最近...
    Katherine的小世界閱讀 737評論 0 5
  • 繼承的概念:子類可以使用父類共享的屬性和方法讥裤,避免重復(fù)代碼提高代碼復(fù)用性。 原型鏈:子類可以共享父類的實例對象和實...
    淺秋_6672閱讀 400評論 0 0
  • 一直打算染發(fā)姻报,今天下定決心走進了理發(fā)店己英。選了一個巧克力色,理發(fā)師給我加了點亞麻色吴旋!花了我整整一下午的時間损肛,但是弄好...
    愛發(fā)呆的貓小姐閱讀 103評論 0 0