super()必须在子类constructor首行调用,因为JavaScript引擎此时尚未初始化this;super()将new创建的空对象传入父类constructor完成属性初始化,之后this才被激活,方可安全访问;任何在super()前的代码(包括变量声明、console.log、条件分支或return后)均会触发ReferenceError。

super() 必须写在子类 constructor 的第一行,且必须在访问或使用 this 之前执行。
为什么必须放在首行
JavaScript 引擎在子类构造函数开始执行时,this 还未被初始化。super() 的作用是把 new 创建的空对象作为 this,传入父类 constructor 完成属性初始化。只有 super() 执行完,this 才被“激活”,后续才能安全读写 this.xxx。
- 哪怕只是声明一个变量、写个 console.log(this) 或 return,只要出现在 super() 前,都会报错
- 条件语句中不能让 super() “可能不执行”,比如 if 分支里调用、或写在 return 后面,都不合法
- 即使父类 constructor 不带参数,也必须写 super(),不能省略
不满足位置要求的典型错误
以下写法全部会触发 ReferenceError: Must call super constructor before accessing 'this':
- constructor() { console.log(this); super(); } —— this 访问在 super 前
- constructor() { let x = 1; super(); } —— 变量声明也算对执行上下文的访问
- constructor(name) { if (name) super(name); } —— super 可能不执行
- constructor() { super(); return; this.x = 1; } —— return 后代码虽不执行,但语法上 super 不在真正首行
super() 调用的是谁、传递什么
super() 实际调用的是直接父类的 constructor,并把当前 new 表达式创建的实例对象作为 this 绑定进去。new.target 始终指向子类构造函数,所以父类内部也能感知到是被子类实例化。
立即学习“Java免费学习笔记(深入)”;
- 如果父类也有继承,它的 super() 会继续向上触发,形成初始化链
- 若父类没定义 constructor,JS 会隐式提供一个等价于 constructor(...args) { super(...args); } 的函数
- 父类 constructor 需要参数时,super() 必须传对应实参,否则父类 this 属性可能未正确赋值
和普通函数调用的本质区别
super() 不是普通函数调用,也不是返回新对象的工厂方法。它是一个语法强制机制,负责打通父类初始化流程与子类实例的 this 绑定。
- 它不创建新对象,只复用 new 已生成的空实例
- 它不可被赋值、不可 typeof、不可作为参数传递
- 它没有 this 绑定(不是函数),也不能用 call/apply 调用


















