繼承

繼承
繼承是 OOP 語言中的一個(gè)最為人津津樂道的概念。許多OOP 語言都支持兩種繼承方式:接口繼承和實(shí)現(xiàn)繼承。接口繼承只繼承方法簽名减牺,而實(shí)現(xiàn)繼承則繼承實(shí)際的方法。如前所述存谎,由于函數(shù)沒有簽名拔疚,在ECMAScript 中無法實(shí)現(xiàn)接口繼承。ECMAScript 只支持實(shí)現(xiàn)繼承既荚,而且其實(shí)現(xiàn)繼承主要是依靠原型鏈來實(shí)現(xiàn)的稚失。

原型鏈
ECMAScript 中描述了原型鏈的概念,并將原型鏈作為實(shí)現(xiàn)繼承的主要方法恰聘。其基本思想是利用原型讓一個(gè)引用類型繼承另一個(gè)引用類型的屬性和方法句各。

構(gòu)造函數(shù)、原型和實(shí)例的關(guān)系:每個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象晴叨,原型對(duì)象都包含一個(gè)指向構(gòu)造函數(shù)的指針凿宾,而實(shí)例都包含一個(gè)指向原型對(duì)象的內(nèi)部指針。那么篙螟,假如我們讓原型對(duì)象等于另一個(gè)類型的實(shí)例菌湃,結(jié)果會(huì)怎么樣呢?顯然遍略,此時(shí)的原型對(duì)象將包含一個(gè)指向另一個(gè)原型的指針惧所,相應(yīng)地,另一個(gè)原型中也包含著一個(gè)指向另一個(gè)構(gòu)造函數(shù)的指針绪杏。假如另一個(gè)原型又是另一個(gè)類型的實(shí)例下愈,那么上述關(guān)系依然成立,如此層層遞進(jìn)蕾久,就構(gòu)成了實(shí)例與原型的鏈條势似。這就是所謂原型鏈的基本概念。

說明

  1. 定義Son構(gòu)造函數(shù)后僧著,我們沒有再使用Son的默認(rèn)原型履因,而是把他的默認(rèn)原型更換成了Father類型對(duì)象。
  2. 這時(shí)盹愚,如果這樣訪問 son1.name, 則先在son1中查找name屬性栅迄,沒有然后去他的原型( Father對(duì)象)中找到了,所以是"馬云"皆怕。
  3. 如果這樣訪問 son1.giveMoney(), 先在son1中找這個(gè)方法毅舆,找不到去他的原型中找西篓,仍然找不到,則再去這個(gè)原型的原型中去找憋活,然后在 Father的原型對(duì)象中 找到了岂津。
  4. 從圖中可以看出來,在訪問屬性和方法的時(shí)候悦即,查找的順序是這樣的:對(duì)象->原型->原型的原型->...->原型鏈的頂端吮成。 就像一個(gè)鏈條一樣,這樣 由原型連成的"鏈條"盐欺,就是我們經(jīng)常所說的原型鏈赁豆。
  5. 從上面的分析可以看出仅醇,通過原型鏈的形式就完成了JavaScript的繼承

默認(rèn)頂端原型
在 JavaScript 中所有的類型如果沒有指明繼承某個(gè)類型冗美,則默認(rèn)是繼承的 Object 類型。這種 默認(rèn)繼承也是通過原型鏈的方式完成的析二。

下面的圖就是一個(gè)完整的原型鏈:

mark

說明:

  1. 原型鏈的頂端一定是Object這個(gè)構(gòu)造函數(shù)的原型對(duì)象粉洼。這也是為什么我們隨意創(chuàng)建一個(gè)對(duì)象,就有很多方法可以調(diào)用叶摄,其實(shí)這些方法都是來自O(shè)bject的原型對(duì)象属韧。
  2. 通過對(duì)象訪問屬性、方法的時(shí)候蛤吓,一定是會(huì)通過原型鏈來查找的宵喂,直到原型鏈的頂端农猬。
  3. 一旦有了繼承毫深,就會(huì)出現(xiàn)多態(tài)的情況羞迷。假設(shè)需要一個(gè)Father類型的數(shù)據(jù)玫氢,那么你給一個(gè)Father對(duì)象芹血,或Son對(duì)象都是沒有任何問題的屯碴。而在實(shí)際執(zhí)行的過程中蚁滋,一個(gè)方法的具體執(zhí)行結(jié)果憔购,就看在原型鏈中的查找過程了泼疑。給一個(gè)實(shí)際的Father對(duì)象則從Fahter的原型鏈中查找德绿,給一個(gè)實(shí)際的Son則從Son的原型鏈中查找。
  4. 因?yàn)槔^承的存在退渗,Son的對(duì)象移稳,也可以看出Father類型的對(duì)象和Object類型的對(duì)象。 子類型對(duì)象可以看出一個(gè)特殊的父類型對(duì)象会油。

幾種測(cè)試數(shù)據(jù)的類型
1.typeof:一般用來測(cè)試簡(jiǎn)單數(shù)據(jù)類型和函數(shù)的類型个粱。
2.instanceof: 用來測(cè)試一個(gè)對(duì)象是不是屬于某個(gè)類型。結(jié)果為boolean值钞啸。
3.isPrototypeOf( 對(duì)象 ) : 這是個(gè) 原型對(duì)象 的方法几蜻,參數(shù)傳入一個(gè)對(duì)象喇潘,判斷參數(shù)對(duì)象是不是由這個(gè)原型派生出來的。 也就是判斷這個(gè)原型是不是參數(shù)對(duì)象原型鏈中的一環(huán)梭稚。
4.函數(shù)借調(diào) Object.prototype.toString.call()

<script>
  function Father () {
    }
    function Son () {
    }

    Son.prototype = new Father();
    var son = new Son();
    console.log(son instanceof Son);  // true
    // Son通過原型繼承了Father
    console.log(son instanceof Father);  // true
    //Father又默認(rèn)繼承了Objcet
    console.log(son instanceof Object); // true
    
    console.log(Son.prototype.isPrototypeOf(son))//true
    
    console.log(typeof new Son())//object
    console.log(Object.prototype.toString.call(/a/gi))//借調(diào)可以檢測(cè)出它的類型 RegExp
    console.log(Object.prototype.toString.call([]))//返回Array
    console.log(Object.prototype.toString.call(function () {
        
    }))//返回function
    var msg=Object.prototype.toString.call([])
    console.log(/[ ](\w+)]/gi.exec(msg))//用正則表達(dá)式輸出類型

</script>

借用構(gòu)造函數(shù)調(diào)用"繼承"

借用構(gòu)造函數(shù)調(diào)用 繼承颖低,又叫偽裝調(diào)用繼承或冒充調(diào)用繼承。雖然有了繼承兩個(gè)字弧烤,但是這種方法從本質(zhì)上并沒實(shí)現(xiàn)繼承忱屑,只是完成了構(gòu)造方法的調(diào)用而已。

使用 call 或 apply 這兩個(gè)方法完成函數(shù)借調(diào)暇昂。這兩個(gè)方法的功能是一樣的莺戒,只有少許的區(qū)別(暫且不管)。功能都是更改一個(gè)構(gòu)造方法內(nèi)部的 this 指向到指定的對(duì)象上急波。

<script>
    function foo(name,age) {
        this.name=name;
        this.age=age;
    }
    var obj={};
    //函數(shù)借調(diào) 借用call
    foo.call(obj,"張三","20")//借調(diào)了foo的this,此處的this就指向obj,所以obj就多了
    //foo的屬性
    console.log(obj)
</script>

組合繼承

組合函數(shù)利用了原型繼承和構(gòu)造函數(shù)借調(diào)繼承的優(yōu)點(diǎn)从铲,組合在一起。成為了使用最廣泛的一種繼承方式澄暮。

<script>
    function Animal(name,color) {
        this.name=name;
        this.color=color;
    }
    Animal.prototype.eat=function () {
        console.log("動(dòng)物在吃")

    }
    function Dog(name,color,weight) {
        Animal.call(this,name,color);//借調(diào)animal中的this屬性
        //this是Animal的this 只是指向改變 指向了dog
        this.weight=weight;
    }
    Dog.prototype=new Animal();
    Dog.prototype.constructor=Dog;
    var dog=new Dog("黑子","黑色",20)
    console.log(dog)
    dog.eat()
    console.log(dog instanceof  Animal)
</script>

說明

  1. 組合繼承是我們實(shí)際使用中最常用的一種繼承方式名段。
  2. 在子類型的構(gòu)造函數(shù)中借調(diào)了父類型的構(gòu)造函數(shù),也就是說泣懊,子類型的原型(也就是Father的對(duì)象)中有的屬性伸辟,都會(huì)被子類對(duì)象中的屬性給覆蓋掉。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末馍刮,一起剝皮案震驚了整個(gè)濱河市信夫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卡啰,老刑警劉巖静稻,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異碎乃,居然都是意外死亡姊扔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門梅誓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恰梢,“玉大人,你說我怎么就攤上這事梗掰∏堆裕” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵及穗,是天一觀的道長(zhǎng)摧茴。 經(jīng)常有香客問我,道長(zhǎng)埂陆,這世上最難降的妖魔是什么苛白? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任娃豹,我火速辦了婚禮,結(jié)果婚禮上购裙,老公的妹妹穿的比我還像新娘懂版。我一直安慰自己,他們只是感情好躏率,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布躯畴。 她就那樣靜靜地躺著,像睡著了一般薇芝。 火紅的嫁衣襯著肌膚如雪蓬抄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天夯到,我揣著相機(jī)與錄音嚷缭,去河邊找鬼。 笑死黄娘,一個(gè)胖子當(dāng)著我的面吹牛峭状,可吹牛的內(nèi)容都是我干的克滴。 我是一名探鬼主播逼争,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼劝赔!你這毒婦竟也來了誓焦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤着帽,失蹤者是張志新(化名)和其女友劉穎杂伟,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仍翰,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赫粥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了予借。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片越平。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖灵迫,靈堂內(nèi)的尸體忽然破棺而出秦叛,到底是詐尸還是另有隱情,我是刑警寧澤瀑粥,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布挣跋,位于F島的核電站,受9級(jí)特大地震影響狞换,放射性物質(zhì)發(fā)生泄漏避咆。R本人自食惡果不足惜舟肉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望查库。 院中可真熱鬧度气,春花似錦、人聲如沸膨报。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽现柠。三九已至院领,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間够吩,已是汗流浹背比然。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留周循,地道東北人强法。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像湾笛,于是被迫代替她去往敵國(guó)和親饮怯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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