【发布时间】:2021-11-09 19:48:39
【问题描述】:
以下是在 Javascript 中实现组合模式的有效策略吗?我想使用类而不是构造函数或普通对象,而且我知道 Mixins 不是最佳实践。一个问题是,在这种方法中,添加到Person 对象的方法没有附加到原型,因此每个方法都需要内存分配。谢谢!
class Person {
name;
constructor(name) {
this.name = name;
}
}
function fly() {
return {
fly() {
console.log(`${this.name} can fly!`);
},
};
}
function swim() {
return {
swim() {
console.log(`${this.name} can swim!`);
},
};
}
function makeFlyingPerson(name) {
return Object.assign(new Person(name), fly());
}
function makeSwimmingPerson(name) {
return Object.assign(new Person(name), swim());
}
【问题讨论】:
-
不过,这仍然是 mixins。您将两个对象混合在一起 - 一个对象的方法/属性被添加到另一个对象。
-
如果它按照您想要的方式工作,它就是有效的。也就是说,我认为
fly、swim等没有任何理由成为函数,正如@VLAZ 指出的那样,这个 is 混合。说到:“而且我知道 Mixins 不是最佳实践” 为什么不呢?根据谁? -
如果您使用 Class 语法的动机是为了简化 Java 和 JavaScript 之间的大脑切换,我建议您的代码对于试图理解这一点的 Java 开发人员来说会非常混乱。如果这是您的目标,那么请一直使用 Class 语法,以便其他人可以轻松掌握它。 FWIW。
-
@r_zelazny ... 对于提供的示例,任何 mixin 支持技术只有在 OP 实际上不希望每个人实例具有飞行和游泳行为/特征时才有意义。否则
Person.prototype仍然是分配此类行为的最佳位置。在这种情况下,稍后通过将所需行为直接混入原型中来增强已经实现的Person类的原型是完全有效的。
标签: javascript design-patterns composition es6-class