super 必须在子类构造函数首行调用,参数严格匹配父类构造器形参,且仅向上调用直接父类;this 在 super 前不可访问,多层继承中每层 super 各自负责本层初始化。

在子类构造函数中用 super 传递参数,核心是让父类完成它负责的那部分初始化——不是创建新对象,而是把父类定义的属性写到当前这个子类实例上。关键不在“传”,而在“匹配”和“时机”。
参数必须严格匹配父类 constructor 的形参
super 后面括号里的实参,个数、顺序、类型都要和父类 constructor 的形参一致。比如父类写的是 constructor(name, age),子类就得写 super(name, age);若父类只接受一个 id,你传两个就会出错,传空或 undefined 可能导致属性值意外为 undefined。
- 父类没写 constructor → 系统默认提供无参空壳,此时
super()不带参数即可 - 父类只有有参 constructor(比如
constructor(email))→ 子类必须显式写super(email),不能省略 - 父类同时有多个重载构造器(如 Java)→ 需根据实际调用目标,传对应参数列表
super() 必须是子类 constructor 中的第一条有效语句
在 super 执行前,this 是未定义的。哪怕只是写一句 console.log('start') 或 let x = 1 放在 super 前,都会报错:ReferenceError: Must call super constructor before accessing 'this'。
- 正确写法:先
super(...),再操作this(赋值、调用方法、读取属性) - 不能和
this(...)(调用本类其他构造器)共存于同一 constructor 中 - TS/JS 中不支持隐式 super 调用带参构造器,只要子类写了 constructor,就必须手动 super
多层继承时,super 只向上交一层
new C() 触发 C 的 constructor,其中 super(...) 调用的是直接父类 B 的 constructor;B 内部的 super(...) 再去调 A;A 若没写 super,则默认调 Object。每层 super 都只负责把参数交给它的直接父类,不会跳过中间层。
- 参数在每一层按需拆解或重组:比如 C 收到 name/age/score,传给 B 的可能是 name/age,B 再把 name 传给 A
-
new.target始终指向最底层被 new 的类(如 C),父类可通过它做实例化来源判断
常见错误与规避方式
容易踩坑的地方往往不是语法写错,而是逻辑没理清:
- 误以为 super 是“转发”——其实它是直接执行父类 constructor,this 指向的是同一个子类实例
- 在父类 constructor 里修改了参数但没意识到影响下游:比如父类把 name 转成大写,子类后续又用原始 name 就会不一致
- TS 中字段未初始化就使用:若父类用 public 参数属性简写(
constructor(public name: string)),子类 super 后 name 已存在;但新增字段仍需自己赋值或用初始化语法(如private score: number = 0)

















