當(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