子类构造函数必须先调用super(),且只能在super()之后使用this;因为this依赖父类构造函数初始化原型链和实例属性,否则会抛出ReferenceError。

在复杂的类继承体系中,保证构造函数里 this 正确传递的核心是:**子类构造函数必须先调用 super(),且只能在 super() 之后使用 this**。这不是可选项,而是 JavaScript 引擎的强制约束——因为子类实例的内存结构和初始属性,必须由父类构造函数来“奠基”。
为什么 super() 必须最先调用?
子类实例的 this 并非天然存在。它依赖父类构造函数执行时完成两件事:
• 初始化原型链(即让 this.__proto__ 指向正确的父类原型)
• 设置父类定义的实例属性(如 this.name、this.id 等)
如果跳过 super() 或延后调用,this 就是未初始化状态,访问它会直接抛出 ReferenceError。
常见错误写法及修正
以下写法都会报错:
-
this.age = 18;写在super()前 → 报错:Cannot access 'this' before initialization -
const val = this.getValue();在super()前调用 → 同样因this未就绪而失败 - 子类没写构造函数,但父类有参数,却未显式调用
super(...args)→ 实例化时报错:Constructor of derived class must call super()
正确顺序只有一种:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
class Child extends Parent {
constructor(name, age, level) {
super(name); // ✅ 第一行必须是 super()
this.age = age; // ✅ 之后才能赋值
this.level = level;
}
}
多层继承时的传递要点
当存在 A → B → C 的三层继承时:
- C 的构造函数必须调用
super(...),这会触发 B 的构造函数 - B 的构造函数也必须调用
super(...),才能把控制权交给 A - 每一层的
super()都要传入当前层需要向上透传的参数(比如 C 拿到name和role,B 只需把name传给 A)
参数不是自动转发的,必须手动提取并传递。漏传会导致父类属性初始化为 undefined。
避免 this 失效的配套实践
构造函数内 this 传递只是起点,后续方法调用仍可能出问题:
- 不要把类方法直接赋值给变量或作为回调(如
btn.onclick = obj.method),否则this丢失 - 修复方式优先选:类字段 + 箭头函数(
handleClick = () => { ... }),它在实例创建时就绑定this - 或在构造函数中用
bind预绑定:this.handleClick = this.handleClick.bind(this) - 避免在子类中重写父类方法时意外覆盖
this上下文(例如用箭头函数重写,会失去动态this)

















