子类构造函数中 super() 必须位于第一行,因为 this 在 super() 前未初始化而不可访问;不调用 super() 则 this 无效,连 console.log(this) 都报错;预处理应操作参数或局部变量,而非 this。

子类构造函数中不能在 super() 之前访问 this,是因为此时实例对象尚未被父类构造函数初始化,this 处于未定义状态。JS 引擎强制要求先完成父类初始化,才能安全使用子类的 this。
为什么 super() 必须在最前面
父类构造函数负责设置实例的基本结构(比如挂载初始属性、绑定原型链)。如果子类在 super() 前就尝试读写 this.name 或调用 this.method(),JS 无法保证该对象已具备合法的内部状态,所以直接抛出 ReferenceError。
- super() 实际执行了父类构造逻辑,并把初始化后的对象赋给 this
- 不调用 super() → this 不可用,连 console.log(this) 都会报错
- 哪怕只是想打印一下参数或做简单判断,也得等 super() 完成后才能碰 this
常见错误写法与修正方式
以下写法都会触发错误:
- 错:在 super() 前给 this.xxx 赋值
- 错:在 super() 前调用 this.xxx() 或 console.log(this)
- 错:传错参数给 super(),导致父类构造失败,间接使 this 初始化异常
正确做法是严格按顺序:接收参数 → 调用 super(…) → 再操作 this。
立即学习“Java免费学习笔记(深入)”;
不写 constructor 时的隐式行为
如果子类没定义 constructor,JS 引擎会自动插入一个默认构造函数:
- constructor(...args) { super(...args); }
- 这种情况下,你完全不用操心 super() 的位置
- 但只要自己写了 constructor,就必须显式调用 super(),且必须第一行
如何复用父类方法而不依赖 this
如果需要在 super() 前做些预处理(比如校验参数、转换格式),可以绕开 this 直接操作传入的参数:
- 对 name 做 trim 或 toUpperCase,再传给 super(name)
- 用局部变量暂存计算结果,super() 后再赋给 this.xxx
- 静态方法或工具函数也可提前介入,它们不依赖实例状态


















