在我的Webapp中,我需要实现一个API,它不包含任何ES6类定义,但是我想扩展其中一个类并覆盖一些方法。重写不能正常工作..。
function A() {
this.msg = function() {
console.log("A");
}
}
class B {
constructor() {
A.call(this);
}
msg() {
console.log("B");
}
}
new B().msg();
我希望结果是"B“,但是执行"class”A的方法。
发布于 2018-12-18 11:41:15
问题是,在A中,msg函数在构造函数中附加到this,也就是说,msg属性直接附加到实例对象本身,而不是在原型上。相反,msg of B位于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优先于A.prototype.msg)
https://stackoverflow.com/questions/53832174
复制相似问题