动态重写原型类方法时如何正确使用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
相关产品推荐
相关产品推荐

