在ES6类中检测静态超级方法

时间:2019-01-12 09:26:00

标签: javascript ecmascript-6 es6-class

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

我需要:

  • 检测超类的存在
    • 致电super.id(),然后附加我自己的id()
  • 如果没有超级玩家,请发送自己的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()) 

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

1 个答案:

答案 0 :(得分:1)

您可以使用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类的原型。但是this与您需要原型的对象完全匹配,因此,Object.getPrototypeOf(this).id可以使原型链更加美观。