子类未定义constructor时,javascript自动插入constructor(...args) { super(...args); },透明转发参数并强制调用父类构造函数以初始化this和原型链,否则报错。

子类没写 constructor 时,JavaScript 会自动插入一个默认构造函数,行为是调用父类的 constructor 并传入所有参数。
默认 constructor 长什么样
如果子类只写了 extends Parent,没写自己的 constructor,引擎会等效生成:
constructor(...args) { super(...args); }- 这个函数不接收固定参数,而是原样转发所有传入的参数给
super() - 它本身不做任何额外初始化,也不修改
this
为什么必须调用 super()
ES6 的继承机制要求:子类实例的内部结构(包括原型链、内部槽位)必须由父类构造函数先行初始化。不调用 super(),this 就不可用,访问或返回都会报错。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 哪怕子类什么都没做,只要继承了父类,就必须完成这一步
- 报错信息明确:"Must call super constructor in derived class before accessing 'this' or returning from derived constructor"
- 这是语言强制约束,不是可选优化
参数传递规则
默认 constructor 的参数处理是“透明转发”,但实际能否成功取决于父类构造函数的签名。
- 如果父类
constructor(x, y)要求两个参数,而你new Child(1)只传一个,就会报错(父类抛出) - 如果父类
constructor(opts = {})有默认值,new Child()就能正常运行 - 子类无法绕过父类的参数校验逻辑——默认行为不提供兜底或适配
继承内置类的特殊情况
当子类继承 Array、Error、Map 等内置类时,即使没写 constructor,也需注意:
- 默认
super(...args)可能无法正确初始化内置实例的内部状态 - 例如
class MyArray extends Array {},new MyArray(3)创建的是稀疏数组,而非长度为 3 的空数组 - 这类场景通常需要显式定义
constructor并手动调用super或使用Reflect.construct
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










