我理解的super:重點看例子中備註
(1)constructor構造函數內容的兩種寫法
(2)constructor內的this指代調用者,類調用,指向該類的實例,子類調用,指向子類的實例
(3)父類的所有內容都被繼承到子類對應的位置。父類中普通方法和屬性,在父類的原型上,被子類原型繼承。父類中的靜態方法和靜態屬性,在父類上,被子類繼承。
(4)子類中constructor,在使用this前,必須先執行一下super()方法,執行父類的constructor函數,之後子類的constructor才能使用this。
(5)子類的constructor中,通過super[prop]賦值時,super代表this。通過super[prop]取值時,super代表父類原型。
(6)靜態方法和屬性可以與普通方法和屬性重名,因爲靜態方法和屬性在類上,而普通方法和屬性在類的原型上。互不影響。
(7)靜態方法只能由類調用,普通方法只有由實例和原型調用。
(8)實例的constructor屬性(bar.constructor)代表的是類Bar。因此可以在類外面調用類的靜態方法和屬性。
(9)當使用 Object.defineProperty
定義一個屬性爲不可寫時,super也不能修改這個屬性的值。
class Foo {
d = 4; //寫在這裏相當於constructor中的this.d;
constructor() {
this.a = 1;
console.log(this);//子類繼承父類時,constructor中的this指代子類實例。創建父類實例時,this指代父類實例。
}
static staticFuncA() {//靜態方法,只有由類調用
console.log("father static function")
}
funcA() {//普通方法,只能由類的原型調用
console.log("a");
}
get propFoo(){
return "父類原型上的屬性";
}
}
class Bar extends Foo {
constructor() {
super();
this.b = 2;
this.c = 3;
super.d = 10;// 設置在this上設置
console.log(super.propFoo,this.d);//取值在父類上取值 undefined 10
Bar.staticFuncB();//靜態方法只能由類調用
Bar.prototype.funcB();//普通方法,在原型上,只有由原型調用
}
funcB() {
console.log(super.funcA);//普通方法中調用super,super代表父類原型Bar.prototype,原型上有類的普通方法和普通屬性
}
static staticFuncB(){//靜態方法可以和普通方法重名,不影響
console.log(super.staticFuncA); //靜態方法中調用super,super代表父類Bar,父類上有類的靜態方法和靜態屬性
}
}
Foo.prop = "static prop";//創建一個靜態屬性,靜態屬性同樣只有由類調用
Bar.staticprop = "static propBar";
var bar = new Bar();
console.log(bar.constructor.staticprop, bar.constructor.prop);//static propBar static prop,bar.constructor是Bar類
bar.funcB();//bar是Bar的實例
總結:super大三用處
(1)在constructor中
super()代表執行父類的constructor,此時父類的constructor中的this指代子類實例
super.prop = 1 super賦值操作,此時super指代this
super.prop super取值,super指代父類原型
(2)在靜態方法中
super指代父類,因爲可以通過super調用父類的靜態方法和屬性
(3)在普通方法中
super指代父類原型,因此可以通過super調用哦父類原型的方法和屬性