js繼承與實(shí)例化(個(gè)人整理)

對(duì)于js繼承一直都是半懂半不懂的狀態(tài)工闺,感覺(jué)需要整理一下:

參考自:
JavaScript原型繼承工作原理
JavaScript實(shí)現(xiàn)繼承的幾種方式
JavaScript繼承方式詳解

1. 區(qū)分類繼承和實(shí)例化的差別

非常常用的類繼承是這個(gè)樣子的:
B.prototype = new A()
這時(shí)候特別容易和實(shí)例化給混淆了(反正我混了):
b = new A()

感覺(jué)不好玩了對(duì)不對(duì),這個(gè)時(shí)候開(kāi)始好奇new到底干了什么事情(理解原理非常重要的撒):

創(chuàng)建類的示例 初始化 返回實(shí)例

用代碼表示如下:

function New (f) { 
    var n = { '__proto__': f.prototype }; /*第一步*/ 
    return function () { 
        f.apply(n, arguments); /*第二步*/ 
        return n; /*第三步*/
     };
}

還是有點(diǎn)云里霧里攻泼,怎么區(qū)分什么時(shí)候是類繼承竣付,什么時(shí)候是實(shí)例化呢?
吶诡延,首先我先想到一切皆為函數(shù),所以無(wú)論是實(shí)例化還是繼承古胆,本質(zhì)上都是擁有A的屬性(函數(shù)或者值)嘛肆良,所以必須要想清楚js是怎么查找一個(gè)東西的屬性的哇:

當(dāng)查找一個(gè)對(duì)象的屬性時(shí),JavaScript 會(huì)向上遍歷原型鏈逸绎,直到找到給定名稱的屬性為止惹恃。

用代碼表示如下:

function getProperty(obj, prop) {
    if (obj.hasOwnProperty(prop)){
        return obj[prop]
    }else if (obj.__proto__ !== null){
        return getProperty(obj.__proto__, prop)
    }else{
        return undefined
    }
}

恩,這下子可以解釋兩者區(qū)別了:
B.prototype = new A() : B.prototype要找自己屬性的時(shí)候:先看看自己有沒(méi)有 --> 看看自己的proto(也就是A.prototype)有沒(méi)有 --> 一路往上
b = new A(): b找自己屬性的時(shí)候:先看看自己有沒(méi)有 --> 看看自己的proto(也就是A.prototype)有沒(méi)有 --> 一路往上

n年前收集了一張圖棺牧,仔細(xì)看巫糙,就是我前面整理的內(nèi)容了(不要暈,仔細(xì)看颊乘,此圖博大精深):

原型鏈解釋.jpg

對(duì)于原型鏈不理解的其實(shí)可以去看Typescript参淹,對(duì)比Typescript和它生成出來(lái)的js代碼,就容易理解了疲牵。

2. js繼承方式

理解第一節(jié)以后承二,js繼承方式什么的榆鼠,so easy啦~

心中只要記住纲爸,作為子類的我,只要能夠擁有父類prototype里的屬性妆够,就可以算作繼承了(個(gè)人理解识啦,覺(jué)不對(duì)可舉正)

感覺(jué)可以用生孩子的例子貫穿這一節(jié)嘛~

  • 原型鏈繼承(其實(shí)就是最開(kāi)始1的那種繼承)

    //父類
    var Animal = function(){
      //可以在構(gòu)造函數(shù)里面直接設(shè)置屬性~
      this.name = 'animal';
    }
    //也可以通過(guò)prototype
    Animal.prototype.say = function(){
      console.log('Animal here');
    }
    
    //子類
    var Dog = function(){
    
    }
    Dog.prototype = new Animal();
    //改寫(xiě)父類prototype
    Dog.prototype.name = 'dog';
    
    //創(chuàng)建實(shí)例
    var doge = new Dog();
    console.log(doge.name)  //'dog';
    doge.say()  //'Animal here';
    

    最傳統(tǒng)的辦法了,自己生

  • 構(gòu)造繼承(借用方法)

    //父類還是一樣樣的
    var Dog = function(){
        Animal.call(this);
        this.name = 'dog';
    }
    
    //創(chuàng)建實(shí)例
    var doge = new Dog();
    console.log(doge.name) //'dog';
    doge.say() //error;
    

咦神妹,哪里不對(duì)颓哮,怎么會(huì)error說(shuō)沒(méi)有這個(gè)方法?!!
仔細(xì)看代碼鸵荠,要理解,Dog只是借用了Animal的構(gòu)造方法冕茅,Animal的say方法是在prototype上的,當(dāng)然找不到了,所以這種方法的問(wèn)題就很明顯啦姨伤,就是并沒(méi)有依靠原型鏈關(guān)系哨坪,就像試管嬰兒嘛,我只是借個(gè)肚子生小孩而已乍楚,基因還是我的(哈哈哈) 也就是說(shuō)如果通過(guò)instanceof檢查doge和Animal的關(guān)系当编,會(huì)發(fā)現(xiàn)返回沒(méi)有關(guān)系的呦。

  • 實(shí)例繼承
    var Dog = function(){
    var dog = new Animal();
    dog.name = 'dog';
    return dog;
    }

    //創(chuàng)建實(shí)例
    var doge = new Dog();
    console.log(doge.name)  //'dog';
    doge.say()  //'Animal here';
    console.log(doge instanceof Animal)  // true
    console.log(doge instanceof Dog)  // false
    

額徒溪,就好象小明爸爸借隔壁老王過(guò)來(lái)生小明~~ 實(shí)例是父類的實(shí)例忿偷,而不是子類的實(shí)例。

  • 拷貝繼承(暴力繼承)
    var Dog = function(){
    var animal = new Animal();
    for(var attr in animal){
    this[attr] = animal[attr];
    }
    this.name = 'dog';
    }

    //創(chuàng)建實(shí)例
    var doge = new Dog();
    console.log(doge.name) //'dog';
    doge.say() //'Animal here';
    console.log(doge instanceof Animal) // false
    console.log(doge instanceof Dog) // true
    

最野蠻的辦法:把老王家的兒子抓過(guò)來(lái)臊泌,照著他的樣子自己生一個(gè)

  • 組合繼承
    var Dog = function(){
    Animal.call(this, arguments);
    this.name = 'dog';
    }
    Dog.prototype = new Animal();

    //創(chuàng)建實(shí)例
    var doge = new Dog();
    console.log(doge.name) //'dog';
    doge.say() //'Animal here';
    console.log(doge instanceof Dog) // true
    console.log(doge instanceof Animal) // true

相當(dāng)于借A肚子生孩子鲤桥,完事拉住孩子和A的手說(shuō):我是你爸,你也來(lái)自A渠概。好處是解決了實(shí)例繼承的問(wèn)題芜壁,壞處嘛,就是叫了兩遍A高氮。

  • Object.create(proto[, propertiesObject])
    ES5引入慧妄,我看著underscore用的主要也是這個(gè)辦法。
    代碼原理解釋:
    Object.create = function (parent) {
    function F() {}
    F.prototype = parent;
    return new F();
    };
    不多解釋了剪芍,至于怎么生塞淹,這個(gè)我真編不出來(lái)了,有點(diǎn)像建個(gè)工廠罪裹,要生娃的基因給我饱普,出來(lái)就是你娃。

其實(shí)說(shuō)多了状共,個(gè)人覺(jué)得重在理解套耕,目標(biāo)是生娃,至于怎么生峡继,就要看清好處壞處了冯袍。

3. 關(guān)于創(chuàng)建對(duì)象模式的一點(diǎn)嗑叨

什么是創(chuàng)建對(duì)象模式?(看到模式就犯頭疼)額碾牌,說(shuō)人話就是實(shí)例化康愤,常見(jiàn)的就是var a = new A()
以前還小的時(shí)候看各種模式什么的舶吗,暈頭轉(zhuǎn)向征冷,浪費(fèi)時(shí)間也浪費(fèi)腦力。
所以推薦先實(shí)踐(酒肉穿腸過(guò)誓琼,佛祖心中流)實(shí)踐多了检激,就會(huì)發(fā)現(xiàn)模式不模式肴捉,自己平時(shí)就在用。
//其實(shí)就是好累好累的叔收,下次再補(bǔ)了

---------此處為撿節(jié)操分割線----------
最近面試發(fā)現(xiàn)自己表達(dá)能力很不行每庆,不知道寫(xiě)出來(lái)的博客會(huì)不會(huì)也整暈別人了== 歡迎舉正~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市今穿,隨后出現(xiàn)的幾起案子缤灵,更是在濱河造成了極大的恐慌,老刑警劉巖蓝晒,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腮出,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡芝薇,警方通過(guò)查閱死者的電腦和手機(jī)胚嘲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)洛二,“玉大人馋劈,你說(shuō)我怎么就攤上這事×浪唬” “怎么了妓雾?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)垒迂。 經(jīng)常有香客問(wèn)我械姻,道長(zhǎng),這世上最難降的妖魔是什么机断? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任楷拳,我火速辦了婚禮,結(jié)果婚禮上吏奸,老公的妹妹穿的比我還像新娘欢揖。我一直安慰自己,他們只是感情好奋蔚,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布她混。 她就那樣靜靜地躺著,像睡著了一般旺拉。 火紅的嫁衣襯著肌膚如雪产上。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天蛾狗,我揣著相機(jī)與錄音,去河邊找鬼仪媒。 笑死沉桌,一個(gè)胖子當(dāng)著我的面吹牛谢鹊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播留凭,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼佃扼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蔼夜?” 一聲冷哼從身側(cè)響起兼耀,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎求冷,沒(méi)想到半個(gè)月后瘤运,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡匠题,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年拯坟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片韭山。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡郁季,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钱磅,到底是詐尸還是另有隱情梦裂,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布盖淡,位于F島的核電站塞琼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏禁舷。R本人自食惡果不足惜彪杉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望牵咙。 院中可真熱鬧派近,春花似錦、人聲如沸洁桌。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)另凌。三九已至谱轨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吠谢,已是汗流浹背土童。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留工坊,地道東北人献汗。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓敢订,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親罢吃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子楚午,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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

  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情尿招,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式矾柜。簡(jiǎn)單...
    舟漁行舟閱讀 7,723評(píng)論 2 17
  • 單例模式 適用場(chǎng)景:可能會(huì)在場(chǎng)景中使用到對(duì)象,但只有一個(gè)實(shí)例就谜,加載時(shí)并不主動(dòng)創(chuàng)建怪蔑,需要時(shí)才創(chuàng)建 最常見(jiàn)的單例模式,...
    Obeing閱讀 2,056評(píng)論 1 10
  • 一. 普通對(duì)象與函數(shù)對(duì)象JavaScript 中吁伺,萬(wàn)物皆對(duì)象饮睬!但對(duì)象也是有區(qū)別的。分為普通對(duì)象和函數(shù)對(duì)象篮奄,Obje...
    80bb3ef13dea閱讀 1,594評(píng)論 1 10
  • JS繼承的實(shí)現(xiàn)方式 既然要實(shí)現(xiàn)繼承捆愁,那么首先我們得有一個(gè)父類,代碼如下: // 定義一個(gè)動(dòng)物類 function ...
    才気莮孒閱讀 457評(píng)論 0 0
  • 一個(gè)人炒了盤(pán)紅燒茄子窟却,坐在客廳一連吃了兩碗飯昼丑。吃完后洗碗刷鍋、把衣服放進(jìn)洗衣機(jī)夸赫。房間里傳來(lái)了電腦里播放的...
    star榮閱讀 306評(píng)論 0 0