JavaScript 中 class 语法中构造函数必须先调用 super 怎么理解
在 javascript 的 es6 类继承中,子类构造函数必须在使用 this 之前调用 super(),这是由引擎对原型链和实例初始化顺序的强制规定决定的。如果不先调用 super(),子类的 this 对象就没有被正确初始化为父类的实例,此时访问 this 会直接抛出 referenceerror。这一机制确保了子类在获取父类定义的属性和方法之前,父类的构造逻辑已经执行完毕,从而保证了继承关系的完整性和安全性。

不调用 super 为什么会导致 ReferenceError
当子类构造函数尝试在 super() 之前访问或赋值 this 时,JavaScript 引擎会立即报错。这是因为在 ES6 规范中,子类的 this 是一个特殊的绑定,它依赖于父类构造函数执行后返回的对象。如果父类构造函数未执行,这个绑定就是无效的,任何对该绑定的操作都会触发运行时错误。

class Parent {
constructor() {
this.name = 'Parent';
}
}
class Child extends Parent {
constructor() {
console.log(this.name); // ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor
super();
}
}
super 调用的时机与参数传递
super() 的调用不仅是为了初始化 this,还负责将参数传递给父类构造函数。开发者可以在调用 super() 时传入具体的参数,以便父类根据这些参数进行初始化。此外,如果子类没有显式定义构造函数,引擎会自动生成一个默认的构造函数,并在其中隐式调用 super(),且不带参数。

class Parent {
constructor(x, y) {
this.x = x;
this.y = y;
}
}
class Child extends Parent {
constructor(x, y, z) {
super(x, y); // 必须在此处调用 super,并传递 x 和 y
this.z = z;
}
}
const child = new Child(1, 2, 3);
console.log(child.x, child.y, child.z); // 输出: 1 2 3
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











