看完一些文章中的super后,发现理解起来有点绕。于是写了这篇文章方便自己和大家理解,不足之处请指正。
super可以作为函数或者对象使用
备注:下面例子中的代码执行环境是VSCode。
super作为函数的用法
super作为函数时,代表父类的构造函数,并且需要放在子类的构造函数中,否则会报错。
class A {
constructor(name) {
this.name = name;//this指向子类实例
}
}
class B extends A {
constructor() {
super('lisi');
}
}
let b = new B();
console.log(b);//B { name: 'lisi' }
super作为对象的用法
super作为对象时会有两种情况:
第一种:super在普通方法中代表父类的原型对象
class A {
constructor() {}
method1() {
this.y = 2; //这里的this指向类B的实例b
}
}
class B extends A {
constructor() {
super();
}
usualMethod() {
super.x = 1; //super==>this
super.method1();
}
}
let b = new B();
b.usualMethod();
console.log(b); //B { x: 1, y: 2 }
第二种:super在静态方法中代表父类
class A {
constructor() {}
static method() {
this.x = 2; //这里的this指向类B
}
}
class B extends A {
constructor() {
super();
}
static staticMethod() {
super.method();
}
}
B.staticMethod();
console.log(B); // [class B extends A] { x: 2 }
补:
一个使用例子:
let obj1 = {
name: 'name1'
}
let obj2 = {
name: 'name2',
func2() {
console.log(super.name); //name1
}
}
Object.setPrototypeOf(obj2, obj1);
obj2.func2();