1.class可以通過(guò)extends關(guān)鍵字實(shí)現(xiàn)繼承,比es5的通過(guò)修改原型鏈實(shí)現(xiàn)繼承,要清晰和方便谭羔。
子類必須在constructor方法中調(diào)用super方法,否則新建實(shí)例時(shí)會(huì)報(bào)錯(cuò)
對(duì)比:
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
在子類的構(gòu)造函數(shù)中,只有調(diào)用super之后卵慰,才可以使用this關(guān)鍵字沙郭,否則會(huì)報(bào)錯(cuò)
2.Object.getPrototypeOf()方法可以用來(lái)從子類上獲取父類。
Object.getPrototypeOf(ColorPoint) === Point// true
可以使用這個(gè)方法判斷裳朋,一個(gè)類是否繼承了另一個(gè)類病线。
3.super關(guān)鍵字
super既可以當(dāng)做函數(shù)使用,也可以當(dāng)做對(duì)象使用鲤嫡。
1>作為函數(shù)調(diào)用時(shí)送挑,代表父類的構(gòu)造函數(shù)。(Es6要求:子類的構(gòu)造函數(shù)必須執(zhí)行一次super函數(shù)暖眼。)
class A{}
class B extends A {
constructor(){
super();
}
}
子類B的構(gòu)造函數(shù)之中的super()惕耕,代表調(diào)用父類的構(gòu)造函數(shù)
注意,super雖然代表了父類A的構(gòu)造函數(shù)诫肠,但是返回的是子類B的實(shí)例司澎,即super內(nèi)部的this指的是B,因此super()在這里相當(dāng)于A.prototype.constructor.call(this)
class A {
constructor() {
console.log(new.target.name);
}
}
class B extends A {
constructor() {
super();
}
}
new A() // A
new B() // B
new.target指向當(dāng)前正在執(zhí)行的函數(shù)
super()內(nèi)部的this指向的是B
當(dāng)作為函數(shù)時(shí)栋豫,super()只能用在子類的構(gòu)造函數(shù)之中惭缰,用在其他地方就會(huì)報(bào)錯(cuò)
2>第二種情況,super作為對(duì)象時(shí)笼才,在普通方法中漱受,指向父類的原型對(duì)象;在靜態(tài)方法中,指向父類昂羡。
屬性定義在父類的原型對(duì)象上絮记,super就可以取到
ES6 規(guī)定,通過(guò)super調(diào)用父類的方法時(shí)虐先,super會(huì)綁定子類的this
使用super的時(shí)候怨愤,必須顯式指定是作為函數(shù)、還是作為對(duì)象使用蛹批,否則會(huì)報(bào)錯(cuò)
4.類的 prototype 屬性和proto屬性
大多數(shù)瀏覽器的 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屬性椅您。
extends 的繼承目標(biāo)
extends關(guān)鍵字后面可以跟多種類型的值外冀。
extends 的繼承目標(biāo)
extends關(guān)鍵字后面可以跟多種類型的值。
class B extends A {
}
代碼的A掀泳,只要是一個(gè)有prototype屬性的函數(shù)锥惋,就能被B繼承。由于函數(shù)都有prototype屬性(除了Function.prototype函數(shù))开伏,因此A可以是任意函數(shù)
三種特殊情況:
1>子類繼承Object類
2>不存在任何繼承
3>子類繼承null
實(shí)例的 proto 屬性
子類實(shí)例的proto屬性的proto屬性膀跌,指向父類實(shí)例的proto屬性。也就是說(shuō)固灵,子類的原型的原型捅伤,是父類的原型
5.原生構(gòu)造函數(shù)的繼承
原生構(gòu)造函數(shù)是指語(yǔ)言內(nèi)置的構(gòu)造函數(shù),通常用來(lái)生成數(shù)據(jù)結(jié)構(gòu)巫玻。ECMAScript 的原生構(gòu)造函數(shù)大致有下面這些丛忆。
Boolean()
Number()
String()
Array()
Date()
Function()
RegExp()
Error()
Object()
以前,這些原生構(gòu)造函數(shù)是無(wú)法繼承的仍秤,比如熄诡,不能自己定義一個(gè)Array的子類
6.Mixin 模式的實(shí)現(xiàn)
Mixin 模式指的是,將多個(gè)類的接口“混入”(mix in)另一個(gè)類