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
如何实现以上目标?
像这样直接调用父类的
some
方法
bcomp.prototype.some.call(this);
而不是
super.some()
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>