【发布时间】:2019-09-04 08:19:44
【问题描述】:
我想要一个 mixin 类,它期望具体类定义一个特定的方法。比如:
function BaseMixin(Base) {
class Mixin extends Base {
doSomething() {
this.onSomethingDone()
}
}
return Mixin
}
同时,我允许可选的 mixins,它们也可能声明这样的方法。最终结果是具体类和每个 mixin 都需要调用 super.onSomethingDone 并且因为应用 mixin 的顺序可以改变,他们还必须检查该方法是否存在:
function SecondaryMixin(Base) {
class Mixin extends Base {
onSomethingDone() {
if (super.onSomethingDone)
super.onSomethingDone()
// stuff specific to SecondaryMixin
}
}
return Mixin
}
class ConcreteClass extends SecondaryMixin(BaseMixin(HTMLElement)) {
doSomething() {
if (super.onSomethingDone)
super.onSomethingDone()
// stuff specific to ConcreteClass
}
}
这是乏味且容易出错的。相反,是否可以只让实现者执行他们的specific stuff 并在BaseMixin 中以某种方式迭代并从所有应用的mixins 中调用onSomethingDone 的所有实现?
function BaseMixin(Base) {
class Mixin extends Base {
doSomething() {
for (let onSomethingDone of getAllImplementationsThereof()) {
onSomethingDone()
}
}
}
}
【问题讨论】:
-
只是 FWIW,那些通常不会被称为 mixins。这些是可选应用的超类。 Mixin 不参与继承。
标签: javascript inheritance mixins