JavaScript 从非 ES6 类覆盖到 ES6 类

标签 javascript es6-class

在我的 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”,但是“类”A 的方法被执行了。

最佳答案

问题是在 A 中,msg 函数附加到构造函数中的 this - 那也就是说,msg 属性直接附加到实例对象本身,而不是原型(prototype)。相比之下,Bmsg 位于Bprototype 上——即B。 prototype,实例继承的对象。

一种选择是在 B 的构造函数中覆盖 msg:

function A() {
  this.msg = function() {
    console.log("A");
  }
}

class B {
  constructor() {
    A.call(this);
    this.msg = () => {
      console.log('b');
    }
  }
}

new B().msg();

一个更好看的原型(prototype)解决方案是 B 扩展 A,如果这是您可以进行的可能修改:

function A() {
  // empty constructor
}
A.prototype.msg = function() {
  console.log("A");
}

class B extends A {
  msg() {
    console.log('b');
  }
}

new B().msg();

(有了这个,内部原型(prototype)链看起来像:A.prototype -> B.prototype -> instance,所以从实例开始,B.prototype.msg优先于 A.prototype.msg)

关于JavaScript 从非 ES6 类覆盖到 ES6 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53832174/

相关文章:

javascript - 停止从方法调用的 ajax 请求 (ES6)

reactjs - 为什么reactjs中的功能组件没有实例?

javascript - 在 ES6 类中禁用 setter/getter ?

javascript - React 类组件在重新渲染时更新类变量的值,但不更新函数组件

javascript - Mapbox GeoJSON 通过本地 URL : icons not showing popup properties 加载

javascript - 检查 div 是否已经显示,并将其隐藏

javascript - 无法在 Next.js v13 中显示加载组件

javascript - PyCharm:src 目录下的 JavaScript 文件被锁定

javascript - 向数据表添加按钮 - Jquery

javascript - 自定义 toString 的推荐方式是什么?使用 Symbol.toStringTag 还是覆盖 toString?