es6中extends强制子类constructor必须调用super()以初始化父类this,否则报错;super()执行前不可访问this;不写constructor时引擎自动补全为super(...args)。

ES6 中 extends 会强制改变子类构造函数的行为,核心影响是:子类 constructor 必须显式或隐式调用 super(),否则无法创建实例。
子类 constructor 必须调用 super()
只要用了 extends,JavaScript 就要求子类在 constructor 中第一件事就是调用 super()(传参需匹配父类构造函数签名)。不调就会报 ReferenceError: Must call super constructor before using 'this'。
- super() 的作用是初始化父类的 this,让子类实例先具备父类定义的所有属性和方法基础
- super() 执行后,this 才可用;在此之前访问 this、赋值属性、return 都会出错
- 即使子类 constructor 只有一行 super(),也合法;如果完全没写 constructor,JS 会自动插入一个空的 constructor() { super(); }
super() 决定了父类构造逻辑是否执行
每次 new 子类实例时,父类 constructor 一定会运行一次——不是可选,而是由 extends + super() 共同保证的机制。
- 父类 constructor 中的代码(如 console.log、属性初始化、副作用操作)都会触发
- 这意味着继承不是“静态复用”,而是“运行时链式构建”:先跑父类逻辑,再跑子类逻辑
- 如果父类 constructor 有参数,子类必须通过 super(…) 传入,否则可能因参数缺失导致父类内部出错
constructor 的原型链和 this 指向被重新约束
extends 不只是语法糖,它改变了实例化过程的底层行为:
- 子类 constructor 的 prototype.__proto__ 指向父类 constructor.prototype,确保方法继承有效
- this 的初始状态由 super() 构建,而不是由子类 constructor 自主创建;这和 ES5 组合继承中先 new 子类再 call 父类完全不同
- 子类实例的 constructor 属性指向子类本身(而非父类),且 instanceof 判断能正确识别多层继承关系
不写 constructor 时的默认行为
如果子类没声明 constructor,引擎会自动补上一个最简版本:
- 相当于写了
constructor(...args) { super(...args); } - 它会把所有参数原样传给父类 constructor,适合不需要额外初始化逻辑的简单继承场景
- 一旦你写了 constructor,就必须手动处理 super(),不能再依赖自动补全











