super() 是子类构造函数中激活 this 的必要步骤,必须首行调用;它触发父类构造函数初始化实例属性、建立原型链,并确保 new.target 正确传递,避免半初始化对象引发错误。

因为 super() 的作用是激活 this,没它,this 就不可用。
super() 是 this 的“解锁开关”
JavaScript 引擎在新建子类实例时,会先创建一个空对象,但此时 this 还未绑定到该对象上,处于“未初始化”状态。只有执行 super() 后,父类构造函数才会被调用,并把那个空对象作为 this 传入父类,完成属性赋值和内部初始化。这一步做完,this 才真正就位,后续才能安全读写 this.xxx。
- 不调 super() 就用 this → 报错:ReferenceError: Must call super constructor before accessing 'this'
- super() 不只是执行父类逻辑,更是为子类实例建立正确的原型链和内部状态
- 即使父类构造函数为空,也必须显式调用 super(),否则 this 始终无法激活
初始化顺序决定执行安全
子类继承的不只是方法,还有父类在构造函数中挂载到 this 上的实例属性(比如 this.name = name)。如果跳过 super() 或延后调用,这些属性根本不会出现在实例上——哪怕原型链完好,方法也能调,但 this.name 仍是 undefined。
- 父类构造函数负责初始化 this 上的自有属性,这是继承不可绕过的环节
- 子类构造函数若在 super() 前尝试设置 this.id,引擎会拒绝,因为 this 还没被“认领”
- 多层继承时,super() 会逐级向上触发,确保每一层的 this 初始化都按序完成
new.target 依赖 super() 的执行时机
super() 不是简单跳转,而是在当前 new 表达式的上下文中,以子类为 new.target 去执行父类构造函数。这意味着父类内部能感知“谁在实例化我”,这对抽象类校验、动态构造等场景至关重要。
立即学习“Java免费学习笔记(深入)”;
- 如果 super() 没在首行执行,new.target 就无法正确传递,父类可能误判调用来源
- 这种机制让继承链上的每个构造函数都能基于真实调用者做逻辑分支,而不是硬编码依赖父类自身
- 省略或延迟 super(),等于切断了这个上下文传递链
语法强制背后的设计意图
这不是 JS 引擎的随意限制,而是为了杜绝“半初始化对象”的使用风险。允许在 super() 前操作 this,等于允许访问一个尚未完成继承初始化的对象,极易引发 undefined、TypeError 或隐性逻辑错误。
- 强制首行调用,确保所有实例属性和内部状态在任何业务代码执行前已就绪
- 避免开发者误以为“先处理参数再初始化”,结果因顺序错乱导致属性丢失
- 与 Java 等语言的设计一致:构造即初始化,初始化必须优先


















