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