javascript - 检测 ES6 类中的静态超方法

标签 javascript ecmascript-6 es6-class

我有一个基类和一个子类。我希望我的类类型有一个通过字符串标识它的静态方法。 (所以我可以在一个对象中查找某种类型的处理程序。我可以直接将类放入其中,但将类的整个源转换为字符串并将其用作键,这似乎不是最理想的。)

我需要:

  • 检测父类(super class)的存在
    • 调用 super.id() 然后附加我自己的 id()
  • 如果没有 super,只需发送我自己的 id()

这是我想象的代码编写方式,但是 super.id 未定义,因此 if 总是失败。检查 if (super) {} 也会因语法错误而失败,而 super.id() 也会失败,因为它“不是函数”。

class Y {
  static id() {
    if (super.id) {
      return `${super.id()}-${this.name}`;
    }
    else {
      return this.name;
    }
  }
}

class YY extends Y {}

// Outputs "Y YY", but I want "Y Y-YY"
console.log(Y.id(), YY.id()) 

我可以在 YY 中定义一个 static id() {} 方法,但随后我必须在所有子类中手动执行此操作,这很容易出错。这样的事可能吗?

最佳答案

您可以使用Object.getPrototypeOf代替super:

class Y {
  static id() {
    if (Object.getPrototypeOf(this).id) {
      return `${Object.getPrototypeOf(this).id()}-${this.name}`;
    }
    else {
      return this.name;
    }
  }
}

class YY extends Y {}

console.log(Y.id(), YY.id()) 

对于super它不起作用,因为它总是引用Y类的原型(prototype)。但是 this 与您需要原型(prototype)的对象完全匹配,因此使用 Object.getPrototypeOf(this).id 您可以通过原型(prototype)链获得一个很好的冒泡。

关于javascript - 检测 ES6 类中的静态超方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54158257/

相关文章:

javascript - ES6 - 如何声明隐式类成员?

javascript - 如何将 React 组件导出为 NPM 包以在单独的项目中使用?

javascript - 在现有网站中使用 ES6 和 React

javascript - Webpack:意外的 token 导入

javascript - 导入 Angular JSON 对象

javascript - 如何保存网页以继续离线工作?

javascript - Ajax上传文件: $_FILES is empty but files exists in request header

javascript - 使用和不使用 new() 预先实例化它们来导出 ES6 类

reactjs - 在 react 中访问类内的状态

javascript - 请帮助我理解 SO 页面源代码中的一些内容