基本概念
Class 實(shí)現(xiàn)繼承主要依賴extends、super、static响蓉。
1.extends關(guān)鍵字:
class Point {
}
class ColorPoint extends Point {
}
上面代碼定義了一個(gè)ColorPoint類,該類通過extends關(guān)鍵字哨毁,繼承了Point類的所有屬性和方法枫甲。但是由于沒有部署任何代碼,所以這兩個(gè)類完全一樣,等于復(fù)制了一個(gè)Point類想幻。
2.super 關(guān)鍵字
super這個(gè)關(guān)鍵字粱栖,既可以當(dāng)作函數(shù)使用,也可以當(dāng)作對(duì)象使用脏毯。在這兩種情況下闹究,它的用法完全不同。
第一種情況食店,super作為函數(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ù)刻伊。這是必須的,否則 JavaScript 引擎會(huì)報(bào)錯(cuò)椒功。
注意捶箱,super雖然代表了父類A的構(gòu)造函數(shù),但是返回的是子類B的實(shí)例动漾,即super內(nèi)部的this指的是B丁屎,因此super()在這里相當(dāng)于A.prototype.constructor.call(this)。
作為函數(shù)時(shí)旱眯,super()只能用在子類的構(gòu)造函數(shù)之中晨川,用在其他地方就會(huì)報(bào)錯(cuò)。
第二種情況删豺,super作為對(duì)象時(shí)共虑,在普通方法中,指向父類的原型對(duì)象呀页;在靜態(tài)方法中妈拌,指向父類。
class A {
p() {
return 2;
}
}
class B extends A {
constructor() {
super();
console.log(super.p()); // 2
}
}
let b = new B();
上面代碼中蓬蝶,子類B當(dāng)中的super.p()尘分,就是將super當(dāng)作一個(gè)對(duì)象使用。這時(shí)丸氛,super在普通方法之中培愁,指向A.prototype,所以super.p()就相當(dāng)于A.prototype.p()缓窜。
這里需要注意定续,由于super指向父類的原型對(duì)象谍咆,所以定義在父類實(shí)例上的方法或?qū)傩裕菬o法通過super調(diào)用的香罐。
ES6 規(guī)定卧波,通過super調(diào)用父類的方法時(shí)时肿,super會(huì)綁定子類的this庇茫。
3.static 靜態(tài)方法
class Parent {
static myMethod(msg) {
console.log('static', msg);
}
myMethod(msg) {
console.log('instance', msg);
}
}
class Child extends Parent {
static myMethod(msg) {
super.myMethod(msg);
}
myMethod(msg) {
super.myMethod(msg);
}
}
Child.myMethod(1); // static 1
var child = new Child();
child.myMethod(2); // instance 2
上面代碼中,super在靜態(tài)方法之中指向父類螃成,在普通方法之中指向父類的原型對(duì)象旦签。
Object.getPrototypeOf方法可以用來從子類上獲取父類。
Object.getPrototypeOf(Child) === Parent // true
因此寸宏,可以使用這個(gè)方法判斷宁炫,一個(gè)類是否繼承了另一個(gè)類。
以上都是個(gè)人理解如有不對(duì)之處還望指正交流氮凝!