3分鐘徹底理解讲逛,js繼承的6種方式

前言:了解熊師傅的朋友都知道亏吝,百度能查的到東西絕對(duì)不會(huì)提及太多,但是如果能按照思路仔細(xì)揣摩相信你一定不會(huì)后悔的盏混,接下來(lái)開始我的表演蔚鸥。

三分鐘徹悟?哈哈哈许赃。止喷。。
原型鏈自不必說(shuō)是js前期最晦澀難懂的地方混聊,也是基礎(chǔ)中的基礎(chǔ)弹谁,是每一位前端必須有所了解的。

別怕句喜,熊師傅帶你來(lái)干 ^ . ^

一.原型鏈繼承

        function aaa (name) {
            this.name = name;
        }
        aaa.prototype.getName = function () {
            return this.name;
        }
        function bbb (name) {
        }
        bbb.prototype = new aaa(‘我是哈哈’);

核心代碼: bbb.prototype = new aaa()
將bbb的原型指向aaa的實(shí)例预愤,aaa的屬性和原型方法都將掛載到bbb的原型下面。
缺點(diǎn):
1.bbb無(wú)法給aaa(父類)的構(gòu)造函數(shù)傳遞參數(shù) (無(wú)法繼承構(gòu)造函數(shù))
2.如果bbb的構(gòu)造函數(shù)也有name屬性咳胃,依然會(huì)在原型上繼承aaa的name屬性植康,造成內(nèi)存浪費(fèi)

二.借用構(gòu)造函數(shù)繼承

        function aaa () {
            this.name = name;
        }
        aaa.prototype.getName = function () {
            return this.name;
        }
        
        function bbb (name, age) {
            aaa.apply(this, name);
            this.age = age;
        }
        
        var oBBB = new bbb();

核心代碼: aaa.apply(this, name)
在new bbb() 的 時(shí)候調(diào)用aaa,借用aaa的構(gòu)造函數(shù)展懈。
缺點(diǎn):
1.無(wú)法做到函數(shù)復(fù)用(說(shuō)白了销睁,沒(méi)有prototype)

三.組合繼承

        function aaa () {
            this.name = name;
        }
        aaa.prototype.getName = function () {
            return this.name;
        }
        
        function bbb (name, age) {
            aaa.apply(this, name);
            this.age = age;
        }
        
        bbb.prototype = new aaa();
        
        var oBBB = new bbb();

什么是組合繼承?
說(shuō)白了存崖,就是把前面兩種繼承方式結(jié)合起來(lái)
核心代碼:
aaa.apply(this, name);
bbb.prototype = new aaa();
思路:bbb通過(guò)call借用aaa的構(gòu)造函數(shù)冻记,并將aaa的屬性和原型方法掛載在自己的原型上面。
缺點(diǎn):
1.依然會(huì)造成內(nèi)存浪費(fèi)来惧,會(huì)把a(bǔ)aa的屬性也寫到bbb的原型上面去冗栗。

四.原型式繼承

先好好揣摩下這個(gè)東西

function object (o) {
    function F () {}
    F.prototype = o;
    return new F();
}

那么這種模式怎么繼承呢?

var aaa = {
    name: 'xxx',
    age: '18',
}

var aaa1 = object(aaa);
var aaa2 = object(aaa);

很顯然aaa1和aaa2的原型上面都會(huì)有name和age屬性。
當(dāng)然缺點(diǎn)也很明顯了:
1.構(gòu)造函數(shù)和prototype不分贞瞒,所有實(shí)例的原型引用一致偶房,容易造成重寫趁曼,和原型鏈繼承的缺點(diǎn)一樣

五.寄生式繼承

說(shuō)白了军浆,對(duì)原型式繼承做了一次改造。先看看如下東西:

function createAnother (obj) {
   var clone = object(obj);
    clone.sayHi = function() {
        alert('hi');
    }
    return clone;
}

var aaa = {
    name: '111',
    age: '2',
};

var aaa1 = createAnother(aaa);

缺點(diǎn):
1.構(gòu)造函數(shù)無(wú)法復(fù)用挡闰,也無(wú)法接受參數(shù)乒融。(其實(shí)有改造空間,把createAnother通過(guò)閉包再封裝一層摄悯,不過(guò)個(gè)人不推薦再改造)

六.寄生組合式繼承

堪稱最完美的方式:

// 這個(gè)命名牛逼不赞季?  in her it ,老鐵奢驯,意會(huì) ^.^
function inherit (sub, sup) {
    var prototype = object(sup.prototype);
    prototype.constructor = sub;
    sub.prototype = prototype;
}

function aaa (name) {
    this.name = name;
}
aaa.prototype.getName = function () {
    alert('111');
}

function bbb (name, age) {
    aaa.call(this, name);
    this.age = age;
}
inherit(bbb, aaa);
bbb.prototype.xixi = function() {
    alert('xixi');
}

到這里基本上解決了所有的問(wèn)題申钩,perfect。具體的工作原理瘪阁,前5種繼承方式如果認(rèn)真研究過(guò)一遍了撒遣,基本上無(wú)需再解釋,若看不懂回過(guò)頭來(lái)再溫習(xí)一遍管跺,熊師傅對(duì)于這一塊也是來(lái)回研究了十來(lái)遍才咯知一二义黎。

但是。
熊師傅對(duì)于第六種繼承方式提出一些大家可能會(huì)有的疑惑豁跑。

1.不是一樣子類繼承父類之后廉涕,父類的prototype依然會(huì)共享,同一個(gè)引用依然會(huì)改變父類的原型呀艇拍?
2.inherit有什么意義狐蜕? 和  sub.prototype = sup.prototype有什么區(qū)別?為什么非要通過(guò)object方法卸夕?

說(shuō)實(shí)話馏鹤,作者在這里也琢磨了一段時(shí)間,算是有一些自己的見(jiàn)解娇哆。如有不對(duì)湃累,歡迎指正

1.好好想一想我們?yōu)槭裁匆^承?不就是為了復(fù)用嗎碍讨?如果不是同一個(gè)引用治力,那繼承又有什么意義?(是不是有點(diǎn)恍然大悟的意思^.^)
2.這里通過(guò)inherit會(huì)重新指正子類sub的構(gòu)造函數(shù)勃黍,如果簡(jiǎn)單的 sub.prototype = sup.prototype, sub.prototype.constructor = sub 會(huì)影響父類sup.

ps:喜歡的朋友別忘記支持一下作者喲^ . ^

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末宵统,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌马澈,老刑警劉巖瓢省,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異痊班,居然都是意外死亡勤婚,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門涤伐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)馒胆,“玉大人,你說(shuō)我怎么就攤上這事凝果∽S兀” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵器净,是天一觀的道長(zhǎng)型雳。 經(jīng)常有香客問(wèn)我,道長(zhǎng)山害,這世上最難降的妖魔是什么纠俭? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮粗恢,結(jié)果婚禮上柑晒,老公的妹妹穿的比我還像新娘。我一直安慰自己眷射,他們只是感情好匙赞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著妖碉,像睡著了一般涌庭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上欧宜,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天坐榆,我揣著相機(jī)與錄音,去河邊找鬼冗茸。 笑死席镀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的夏漱。 我是一名探鬼主播豪诲,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼挂绰!你這毒婦竟也來(lái)了屎篱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎交播,沒(méi)想到半個(gè)月后重虑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秦士,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年缺厉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伍宦。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡芽死,死狀恐怖乏梁,靈堂內(nèi)的尸體忽然破棺而出次洼,到底是詐尸還是另有隱情,我是刑警寧澤遇骑,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布卖毁,位于F島的核電站,受9級(jí)特大地震影響落萎,放射性物質(zhì)發(fā)生泄漏亥啦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一练链、第九天 我趴在偏房一處隱蔽的房頂上張望翔脱。 院中可真熱鬧,春花似錦媒鼓、人聲如沸届吁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)疚沐。三九已至,卻和暖如春潮模,著一層夾襖步出監(jiān)牢的瞬間亮蛔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工擎厢, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留究流,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓动遭,卻偏偏與公主長(zhǎng)得像芬探,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子沽损,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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

  • 1灯节、構(gòu)造函數(shù)模式 [url=]file:///C:/Users/i037145/AppData/Local/Tem...
    橫沖直撞666閱讀 851評(píng)論 0 0
  • 本章內(nèi)容 理解對(duì)象屬性 理解并創(chuàng)建對(duì)象 理解繼承 面向?qū)ο笳Z(yǔ)言有一個(gè)標(biāo)志,那就是它們都有類的概念,而通過(guò)類可以創(chuàng)建...
    悶油瓶小張閱讀 851評(píng)論 0 1
  • 博客內(nèi)容:什么是面向?qū)ο鬄槭裁匆嫦驅(qū)ο竺嫦驅(qū)ο缶幊痰奶匦院驮瓌t理解對(duì)象屬性創(chuàng)建對(duì)象繼承 什么是面向?qū)ο?面向?qū)ο?..
    _Dot912閱讀 1,424評(píng)論 3 12
  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品炎疆,去做同樣的事情卡骂,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式。簡(jiǎn)單...
    舟漁行舟閱讀 7,761評(píng)論 2 17
  • 第九章 在黑色高中的草地上幽幽手里捧著一束玫瑰形入,手中拿著一張卡片全跨,而眼淚不停的往下落下來(lái), 幽: 離開你八年了亿遂,在...
    你懂的黑色閱讀 262評(píng)論 1 0