JavaScript从非ES6类覆盖到ES6类

时间:2018-12-18 11:35:57

标签: javascript es6-class

在我的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的方法将被执行。

1 个答案:

答案 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