ES6中Class的繼承

當(dāng)你想要放棄了,一定要想象那些睡得比你晚、氣的比你早、跑的比你還快、天賦比你還高的牛人,他們?cè)缫言诔抗庵?,跑向那個(gè)你永遠(yuǎn)只能眺望的遠(yuǎn)方。

一、簡(jiǎn)介

1、Class可以通過(guò)extends關(guān)鍵字繼承。
2、ES5的繼承,實(shí)質(zhì)先創(chuàng)建子類的實(shí)例對(duì)象this,然后再將父類的方法添加到this上面(Parent.apply(this))。ES6的繼承機(jī)制完全不同,實(shí)質(zhì)是先創(chuàng)造父類的實(shí)例對(duì)象this(必須先調(diào)用super方法),然后再用子類的構(gòu)造函數(shù)修改this。
3、在子類的構(gòu)造函數(shù)中,只有調(diào)用super之后,才可以使用this關(guān)鍵字。因?yàn)樽宇悓?shí)例的構(gòu)建,是基于對(duì)父類實(shí)例加工,只有super方法才能返回父類實(shí)例。

二、Object.getPrototypeOf()

Object.getPrototypeOf方法可以用來(lái)從子類上獲取父類。
例:
    Object.getPrototypeOf(ColorPoint) === Point
// true

三、super關(guān)鍵字

作為函數(shù)使用

??????1、super作為函數(shù)時(shí)調(diào)用時(shí),代表父類的構(gòu)造函數(shù)。
??????2、ES6要求,子類的構(gòu)造函數(shù)必須執(zhí)行一次super函數(shù)。
??????3、super()只能用在子類的構(gòu)造函數(shù)之中。

作為對(duì)象使用

??????1、super作為對(duì)象時(shí),在普通方法中,指向父類的原型對(duì)象;在靜態(tài)方法中,指向父類。
??????2、由于super指向父類的原型對(duì)象,所以定義在父類實(shí)例上的方法或?qū)傩?,是無(wú)法通過(guò)super調(diào)用的。如果定義在父類的原型上,super就可以獲取到。

四、類的prototype屬性和proto屬性

1、在ES5的實(shí)現(xiàn)之中,每一個(gè)對(duì)象都有proto屬性,指向?qū)?yīng)的構(gòu)造函數(shù)的prototype屬性。 Class作為構(gòu)造函數(shù)的語(yǔ)法糖,同時(shí)有prototype屬性和proto屬性,因此同時(shí)存在兩條繼承鏈。
??????(1)子類的proto屬性,表示構(gòu)造函數(shù)的繼承,總是指向父類。
??????(2)子類prototype屬性的proto屬性,表示方法的繼承,總是指向父類的prototype屬性。
兩條繼承鏈:作為一個(gè)對(duì)象,子類的原型(proto屬性)是父類;作為一個(gè)構(gòu)造函數(shù),子類的原型對(duì)象(prototype屬性)是父類的原型對(duì)象的實(shí)例。

實(shí)例的proto屬性

??????1、子類實(shí)例的proto屬性的proto屬性,指向父類實(shí)例的__proto屬性。也就是說(shuō),子類的原型的原型,是父類的原型。

五、原生構(gòu)造函數(shù)的繼承

1、原生構(gòu)造函數(shù)是指語(yǔ)言內(nèi)置的構(gòu)造函數(shù),通常用來(lái)生成數(shù)據(jù)結(jié)構(gòu)。
??????- Boolean()
??????- Number()
??????- String()
??????- Array()
??????- Date()
??????- Function()
??????- RegExp()
??????- Error()
??????- Object()
2、ES5是先新建子類的實(shí)例對(duì)象this,再將父類的屬性添加到子類上,由于父類的內(nèi)部屬性無(wú)法獲取,導(dǎo)致無(wú)法繼承原生的構(gòu)造函數(shù)。如,Array構(gòu)造函數(shù)有一個(gè)內(nèi)部屬性[[DefineOwnProperty]],用來(lái)定義新屬性,更新length屬性,這個(gè)內(nèi)部屬性無(wú)法在子類獲取,導(dǎo)致子類的length屬性不正常。

var colors = new MyArray();
colors[0] = "red";
colors.length // 0

colors.length = 0;
colors[0] // "red"

3、ES6允許繼承原生構(gòu)造函數(shù)定義子類,因?yàn)镋S6是先新建父類的實(shí)例對(duì)象this,然后再用子類的構(gòu)造函數(shù)修飾this,使得父類的所有行為都可以繼承。

class MyArray extends Array {
     constructor(...args) {
         super(...args);
     }
}

var arr = new MyArray();
arr[0] = 12;
arr.length // 1

arr.length = 0;
arr[0] // undefined
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • class的基本用法 概述 JavaScript語(yǔ)言的傳統(tǒng)方法是通過(guò)構(gòu)造函數(shù),定義并生成新對(duì)象。下面是一個(gè)例子: ...
    呼呼哥閱讀 4,210評(píng)論 3 11
  • 簡(jiǎn)介 Class 可以通過(guò)extends關(guān)鍵字實(shí)現(xiàn)繼承,這比 ES5 的通過(guò)修改原型鏈實(shí)現(xiàn)繼承,要清晰和方便很多。...
    emmet7life閱讀 410評(píng)論 0 0
  • 基本語(yǔ)法 簡(jiǎn)介 JavaScript語(yǔ)言中,生成實(shí)例對(duì)象的傳統(tǒng)方法是通過(guò)構(gòu)造函數(shù). ES6提供更接近傳統(tǒng)語(yǔ)言的寫法...
    JarvanZ閱讀 947評(píng)論 0 0
  • 繼承6種套餐 參照紅皮書,JS繼承一共6種 1.原型鏈繼承 核心思想:子類的原型指向父類的一個(gè)實(shí)例 Son.pro...
    燈不梨喵閱讀 3,261評(píng)論 1 2
  • “ 后有車駛來(lái),駛過(guò)暮色蒼 ,舊鐵皮往南開,戀人已不在”,無(wú)聊的午后聽到這首歌詞, 耳朵被街道上的喧鬧聲 斷折磨。...
    小風(fēng)扇慢慢的吹閱讀 947評(píng)論 0 0

友情鏈接更多精彩內(nèi)容