js super 实现
super 在 JavaScript 中的实现
在 JavaScript 中,super 关键字用于调用父类的构造函数或方法。它在类继承中扮演重要角色,确保子类可以访问父类的属性和方法。
调用父类构造函数
在子类的构造函数中,super() 必须在 this 之前调用,否则会抛出错误。这是因为 super() 负责初始化父类的 this 绑定。
class Parent {
constructor(name) {
this.name = name;
}
}
class Child extends Parent {
constructor(name, age) {
super(name); // 调用父类构造函数
this.age = age;
}
}
const child = new Child('Alice', 10);
console.log(child.name); // 输出: Alice
调用父类方法
super 也可以用于调用父类的方法,通常用于方法重写(override)时保留父类的逻辑。
class Parent {
greet() {
return 'Hello from Parent';
}
}
class Child extends Parent {
greet() {
return super.greet() + ' and Hello from Child';
}
}
const child = new Child();
console.log(child.greet()); // 输出: Hello from Parent and Hello from Child
super 在静态方法中的使用
super 也可以在静态方法中调用父类的静态方法。
class Parent {
static staticMethod() {
return 'Static method in Parent';
}
}
class Child extends Parent {
static staticMethod() {
return super.staticMethod() + ' extended in Child';
}
}
console.log(Child.staticMethod()); // 输出: Static method in Parent extended in Child
super 的限制
super只能在派生类(子类)中使用,普通函数或非继承类中使用会报错。- 在构造函数中,
super()必须在访问this之前调用。 - 如果子类没有定义构造函数,会默认调用
super()并传递所有参数。
super 的实现原理
super 的行为基于 JavaScript 的原型链机制。当调用 super.method() 时,引擎会从当前类的 [[HomeObject]] 属性指向的原型对象上查找方法。[[HomeObject]] 是函数在定义时确定的,指向方法所属的对象。

// 近似实现逻辑(非实际代码)
function getSuperMethod(currentClass, methodName) {
const parentProto = Object.getPrototypeOf(currentClass.prototype);
return parentProto[methodName];
}






