You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动态重写原型类方法时如何正确使用super关键字?

问题:重写类原型方法时如何正确使用super关键字

原始代码及执行结果

原始类定义代码:

class bcomp {
 some(){
    console.log("bcomp");
 }
}
class acomp extends bcomp {
 some(){
    super.some();
    console.log("acomp");
 }
}
var ins = new acomp();
ins.some()

执行后输出:

bcomp
acomp

遇到的问题

尝试通过原型重写acomp的some方法并使用super时,出现语法错误:
重写代码:

acomp.prototype.some = function (params) {
    super.some();
    console.log("new acomp");
}

报错信息:

SyntaxError: 'super' keyword unexpected here

解决方案及原因

原因

super关键字只能在类内部的方法定义或者对象字面量的方法定义中使用,因为这些场景下的函数会被自动赋予[[HomeObject]]属性,JavaScript能通过这个属性定位到父类的原型。而普通函数表达式赋值给原型属性时,没有这个内部属性,所以super无法识别要指向的父类原型,导致报错。

实现方法

你可以通过两种方式实现需求:

方法1:直接调用父类原型的方法并绑定当前this

acomp.prototype.some = function(params) {
    // 调用父类bcomp原型上的some方法,同时绑定当前实例的this
    bcomp.prototype.some.call(this);
    console.log("new acomp");
}

方法2:动态获取父类原型(更灵活,适合不确定父类的场景)

acomp.prototype.some = function(params) {
    // 获取acomp原型的原型(即父类bcomp的原型)
    const parentProto = Object.getPrototypeOf(acomp.prototype);
    // 调用父类方法并绑定this
    parentProto.some.call(this);
    console.log("new acomp");
}

修改后执行ins.some(),会输出:

bcomp
new acomp

内容的提问来源于stack exchange,提问作者MOHAMED SIKKANDAR AFZAL M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 14:20:11