super存在于类的函数中,constructor、普通方法、静态方法,分别代表不同值。
super大三用处
(1)在constructor中
super()执行,相等于父类constructor方法执行。得到constructor内外this上的属性。
super赋值,super.prop = 1 super赋值操作,此时super指代this;给this对象添加或修改属性值。
super取值,super.prop,super指代父类原型。读取父类原型上的属性或方法。
取值取原型、赋值赋给自己;
(2)在静态方法中
super指代父类,因为可以通过super调用父类的静态方法和属性
(3)在普通方法中
super指代父类原型,因此可以通过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的实例
子类中constructor,在使用this前,必须先执行一下super()方法,执行父类的constructor函数,之后子类的constructor才能使用this。。
当使用 Object.defineProperty
定义一个属性为不可写时,super也不能修改这个属性的值。