在我的Webapp中,我需要实现一个API,该API不包含任何ES6类定义,但是我想扩展这些类之一并重写某些方法。覆盖无法正常工作...
function A() {
this.msg = function() {
console.log("A");
}
}
class B {
constructor() {
A.call(this);
}
msg() {
console.log("B");
}
}
new B().msg();
我希望得到“ B”作为结果,但是“类” A的方法将被执行。
答案 0 :(得分:4)
问题在于,在A
中,msg
函数被附加到构造函数中的this
中-即msg
属性是直接附加到实例对象本身,而不是附加在原型上。相反,msg
的{{1}}在B
的 prototype 上-即实例继承的对象B
。
一种选择是在B.prototype
的构造函数中覆盖msg
:
B
一个更好看的原型解决方案是让function A() {
this.msg = function() {
console.log("A");
}
}
class B {
constructor() {
A.call(this);
this.msg = () => {
console.log('b');
}
}
}
new B().msg();
扩展B
,如果可以的话,您可以进行以下修改:
A
(由此,内部原型链看起来像:function A() {
// empty constructor
}
A.prototype.msg = function() {
console.log("A");
}
class B extends A {
msg() {
console.log('b');
}
}
new B().msg();
,因此从实例来看,A.prototype -> B.prototype -> instance
的优先级高于B.prototype.msg
)