最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
在调用父类构造函数时使用super 顺序怎么排?
时间:2026-07-08 11:45:02 编辑:袖梨 来源:一聚教程网
必须在子类构造函数开头调用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 调用
相关文章
- 诛仙2玩法是什么 07-08
- 异环伊波恩合伙人行动任务完成指引 07-08
- DNF盛夏沁甜菠萝宝珠1属性全览 07-08
- DNF盛夏惬意特饮属性全览 07-08
- 理智边缘好玩不 理智边缘玩法简介 07-08
- 崩坏星穹铁道千冶刃玩法解析 07-08