super传递参数的本质是直接调用父类constructor并绑定this到子类实例,参数须严格匹配父类形参;super()必须首行执行以初始化this;多层继承中逐级触发父类构造器;方法中super仅用于访问父类原型成员。

super 传递参数的本质,是把子类构造函数收到的值,原样交给父类构造函数执行初始化。它不是“转发”或“代理”,而是直接触发父类 constructor,并让 this 指向同一个新对象——这个对象最终属于子类,但属性由父类构造函数写入。
super(args) 就是在调用父类 constructor
当你写 super(name, age),JavaScript 引擎会立即执行父类的 constructor 函数体,把 name 和 age 作为实参传进去。父类内部的 this 就是那个正在构建的子类实例,所以 this.name = name 实际是往子类实例上挂属性。
- 参数个数和顺序必须与父类 constructor 的形参匹配,否则父类可能收到 undefined 或出错
- 如果父类 constructor 不接受参数,super() 就不能带任何参数
- 父类若没写 constructor,JS 会隐式提供一个等价于
constructor(...args) { super(...args); }的空壳
super 必须在 this 使用前调用
子类 constructor 中的 this 在 super() 执行完之前是未初始化的。引擎强制要求 super() 是第一句有效语句,否则报 ReferenceError: Must call super constructor before accessing 'this'。
- 哪怕只是
console.log(this)或let x = this,出现在 super() 前都会失败 - super() 一执行完,this 就“激活”了,之后才能赋值、读取、调用方法
- 这和普通函数调用不同——super() 是构造过程的关键环节,绑定 this 并启动初始化链
多层继承时,super 逐级向上触发
比如 A → B → C 三层继承,new C() 会先触发 C 的 constructor,其中 super() 调用 B 的 constructor;B 中 super() 再调用 A 的 constructor;A 若没 super(),则默认调用 Object 构造器。
- 每层 super(args) 都只负责把参数传给**直接父类**,不跳过中间层
- new.target 始终是 C(最底层子类),即使在 A 的 constructor 里,new.target 也是 C
- 这意味着父类可以基于 new.target 判断“谁真正发起的实例化”,用于抽象类校验等场景
super 在方法中不传参,只用于访问父类原型成员
在普通方法(非 constructor)里,super.methodName() 是合法的,但它不接受括号调用形式(如 super()),也不传构造参数。它只是从父类原型上查找 methodName 并以当前子类实例为 this 调用。
- 例如子类重写了 say(),仍可用 super.say() 复用父类逻辑
- super.xxx 只能在方法体内用,不能在箭头函数或顶层作用域出现
- 这里没有“参数传递”的概念,只有方法调用和属性访问











