在 javascript 的类继承中,this 在 super() 调用期间指向当前正在初始化的子类实例。必须在子类的构造函数中先调用 super(),然后才能访问 this,否则会在初始化完成前抛出引用错误。

为什么 super() 之前不能使用 this
因为此时父类的构造函数尚未执行,实例的内部槽(如 [[HomeObject]])未绑定,直接访问 this 会触发 ReferenceError。必须先通过 super() 完成父类构造和原型链设置。

class Parent {
constructor() {
this.name = 'Parent';
}
}
class Child extends Parent {
constructor() {
// super(); // 如果注释掉这行,下面会报错
console.log(this); // ReferenceError: Must call super constructors in sub-class
// constructors before accessing 'this' or returning from derived constructor.
}
}
super() 之后 this 的行为与属性继承
一旦 super() 执行完毕,this 就完全指向子类实例,可以安全地添加子类特有属性或调用子类方法。父类在 super() 中设置的属性也会出现在该实例上。

class Parent {
constructor() {
this.name = 'Parent';
}
}
class Child extends Parent {
constructor() {
super(); // 调用父类构造函数,this 被正确初始化
this.age = 10; // 现在可以安全使用 this
}
}
const child = new Child();
console.log(child.name); // 'Parent'
console.log(child.age); // 10
super 作为函数调用时的上下文绑定
当在子类方法中调用 super.method() 时,super 关键字本身不绑定 this,但方法体内的 this 仍然指向调用该方法的实例对象。这意味着父类方法是在子类实例的上下文中执行的,可以访问子类扩展的属性。
class Parent {
constructor() {
this.type = 'Parent';
}
greet() {
return `Hello, I am ${this.type}`;
}
}
class Child extends Parent {
constructor() {
super();
this.type = 'Child'; // 覆盖父类属性
}
greet() {
const parentGreeting = super.greet(); // 调用父类方法
return `${parentGreeting} and I am a subclass`;
}
}
const child = new Child();
console.log(child.greet()); // 'Hello, I am Child and I am a subclass'
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











