在调用父类构造函数时使用super 顺序怎么排?

作者:袖梨 2026-07-08
必须在子类构造函数开头调用super()且仅一次;若定义constructor则必须显式调用super()并置于首行,否则报错;即使无参也需super();不可在super()前访问this或写其他语句;参数须匹配父类签名;多层继承中每级均需调用直接父类super();未声明constructor时自动插入super()。

必须在子类构造函数的开头调用 super(),且只能调用一次。

super() 必须是第一条语句

JavaScript 和 TypeScript 中,只要子类定义了 constructor,就必须显式调用 super(),而且它必须出现在 constructor 的第一行。否则会报错:ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor

  • 这是为了确保父类的初始化逻辑先执行,从而让 this 对象具备正确的原型链和初始状态
  • 哪怕你不需要传参,也要写 super()(空调用)
  • 不能在 super() 前访问 this,也不能在它前面写其他语句(包括 let/const 声明、return、if 判断等)

参数传递要匹配父类构造函数签名

super(...args) 传入的参数,必须与父类 constructor 的形参顺序和类型一致。

  • 比如父类是 constructor(name, age),子类就得写 super(name, age)
  • 可以做预处理:如 super(name.trim(), Math.max(0, age)),但调用本身仍在第一行
  • 如果父类构造函数有默认值或可选参数,也要按需传入,避免意外 undefined

继承链中每级都要调用 super

如果存在多层继承(A → B → C),每一级子类的 constructor 都必须调用自己的直接父类的 super()

  • C 类调用 B 的 super(),B 类再调用 A 的 super()
  • 不能跳过中间层,比如 C 直接调用 A 的构造函数——语法上不允许
  • 每级的 super() 都遵循“第一行”规则

不写 constructor 时自动插入 super()

如果子类没定义 constructor,JS/TS 会自动补一个空构造函数,并在其中调用 super()

  • 相当于隐式写了 constructor(...args) { super(...args); }
  • 此时你无法控制参数传递逻辑,所以需要自定义初始化时,必须显式声明 constructor 并手动调用 super
  • 一旦写了 constructor,隐式行为就失效,必须自己负责 super 调用

相关文章

精彩推荐