super调用父类普通方法时,参数直接写在括号内,原样传递给父类原型上的对应方法,this始终指向子类实例,不涉及隐式转发。

super在调用父类**普通方法**(非构造函数)时,参数是直接跟在括号里的,写法和普通函数调用完全一样: super.methodName(arg1, arg2)。它不涉及“转发”或“隐式传递”,就是把括号里的实参原样传给父类原型上对应的方法。
super调用父类方法的参数传递规则
这个过程本质是:从父类原型对象上找到 methodName,然后以当前子类实例为 this,执行该方法,并把括号内的参数依次传入。
- 参数个数、类型、顺序完全由父类方法定义决定,子类不干预也不转换
- 可以传任意合法值:字符串、数字、对象、甚至 undefined 或 null
- 如果父类方法没定义形参,传参也不会报错,只是参数被忽略(类似普通 JS 函数)
- 不能省略括号——super.methodName 不执行调用,只是取引用;必须写 super.methodName() 或 super.methodName(x)
常见写法示例
比如父类有一个带两个参数的方法:
class Animal {
speak(voice, times) {
return `${voice} `.repeat(times).trim();
}
}
class Dog extends Animal {
speak(voice, times) {
// 复用父类逻辑,但加前缀
const base = super.speak(voice, times); // ← 这里传了 voice 和 times
return `Dog says: ${base}`;
}
}
调用 new Dog().speak('woof', 3) 会得到 "Dog says: woof woof woof"。
和构造函数中 super() 的关键区别
别混淆两种用法:
- 在 constructor 里:super(...) 是调用父类构造器,必须首行执行,参数必须严格匹配父类 constructor 形参
- 在普通方法里:super.xxx(...) 是调用父类原型上的方法,无执行顺序限制,参数按需传,不强制匹配任何东西
注意 this 指向始终是子类实例
哪怕通过 super 调用,方法内部的 this 仍是当前子类实例,不是父类实例。这意味着:
- 可以访问子类新增的属性(如 this.color)
- 如果子类重写了某个 getter/setter,父类方法里读 this.xxx 仍走子类版本
- 父类方法中调用的其他 this 方法,也会基于子类原型链查找(符合动态绑定)











