class讲解之10 super
2020-08-11 本文已影响0人
zhang463291046
以下内容是引用或者借鉴别人的,自己只是做个笔记,方便学习。理解错误的地方,欢迎评论。如有侵权,私聊我删除,未经允许,不准作为商业用途
super
必须显式指定是作为函数、还是作为对象使用,否则会报错
class A {
x =1
}
class B extends A {
constructor() {
super();
console.log(super.x) // 1
console.log(super); // 报错
}
}
在子类实例方法中通过super
调用父类的实例方法时,这时super
将指父类的原型对象,父类方法内部的this
此时指向当前的子类实例
class A {
x = 1
static x = 2
print() {
console.log(this.x); // this指向b
}
static print() {
console.log(this.x);
}
}
class B extends A {
static x = 3
constructor() {
super();
this.x = 4;
}
m() {
super.print(); // super指向A.prototype
}
static m() {
super.print();
}
}
let b = new B();
b.m() // 4
// 没有实例化,此时父类实例方法this指向B.prototype
B.prototype.m() // undefined
在子类静态方法中通过super
调用静态父类的方法时,这时super
将指向父类,而不是父类的原型对象,父类方法内部的this
指向当前的子类,而不是子类的实例
class A {
x = 1
static x = 2
print() {
console.log(this.x);
}
static print() {
console.log(this.x);// this指向B
}
}
class B extends A {
static x = 3
constructor() {
super();
this.x = 4;
}
m() {
super.print();
}
static m() {
super.print(); // super指向A
}
}
B.m() // 3
小结:父类中的this
其实就是子类中的this
- 实例化时,是实例对象
- 没有实例化时,子类调用静态方法,是子类
- 没有实例化时,子类原型
prototype
调用实例方法,是子类原型prototype