如何在不使用 super 关键字的情况下动态修补原型类方法?

问题描述 投票:0回答:2
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
关键字覆盖
super
的某些方法

acomp.prototype.some = function (params) {
    super.some();
    console.log("new acomp");
}
SyntaxError: 'super' keyword unexpected here

如何实现以上目标?

javascript class methods prototype patch
2个回答
0
投票

像这样直接调用父类的

some
方法

bcomp.prototype.some.call(this);

而不是

super.some()


0
投票

some
的通用补丁方法,其目标是该对象原型链中的对象第二原型,而无需知道对象/实例的相关类将使用
Object.getPrototypeOf
两次。

此外,应该将

Reflect.getOwnPropertyDescriptor
Reflect.defineProperty
一起使用,以便以最正确的方式修补这一新的
some
方法。

// new prototypal `AComp` method.
function some() {

  // `BComp.prototype`
  Object.getPrototypeOf(

    // `AComp.prototype`
    Object.getPrototypeOf(this)
  )
  ?.some();

  console.log("new acomp");
}

Reflect.defineProperty(
  AComp.prototype, 'some', {
    ...Reflect.getOwnPropertyDescriptor(AComp.prototype, 'some'),
    value: some,
  },
);

(new AComp).some();
.as-console-wrapper { min-height: 100%!important; top: 0; }
<script>
class BComp {
 some(){
    console.log("bcomp");
 }
}
class AComp extends BComp {
 some(){
    super.some();
    console.log("acomp");
 }
}
</script>

© www.soinside.com 2019 - 2024. All rights reserved.