大家好,我有抽象类计算机:
class Computer {
constructor(manufacturer, processorSpeed, ram, hardDiskSpace) {
if (new.target === Computer) {
throw new Error("Cannot instantiate directly.");
}
this.manufacturer = manufacturer;
this.processorSpeed = Number(processorSpeed);
this.ram = Number(ram);
this.hardDiskSpace = Number(hardDiskSpace);
}
}
和扩展Computer类的Desktop类。我正在尝试将mixin功能挂接到Computer Class,如下所示:
computerQualityMixin.call(Computer.prototype);
并将其用于Desktop类的对象。下面是我的mixin代码;
function computerQualityMixin() {
let ram = this.ram;
let processorSpeed = this.processorSpeed;
let hardDiskSpace = this.hardDiskSpace;
this.getQuality = () => {
return processorSpeed
* ram
* hardDiskSpace;
};
this.isFast = () => {
return processorSpeed > ram / 4;
};
this.isRoomy = () => {
return hardDiskSpace > Math.floor(ram * processorSpeed);
};
}
问题是,我得到了'undefined'的所有属性,我试图得到:'this.ram'例如在我的mixin中,当我调用一些函数时:
let desktop = new Desktop("JAR Computers", 3.3, 8, 1);
console.log(desktop.getQuality());//Returns NaN because try to make Math operations with 'undefined'
有人能帮我理解mixin吗?谢谢
2条答案
按热度按时间thigvfpy1#
这些评论提出了一个很好的问题,即您是否真的希望在这里使用mixin。但是,如果您这样做,您可能需要查看Angus Croll和Reg Braithwaite的文章
使用前者的技术,您可以重写为
然后您应该能够在
Computer
示例上调用这些方法。ulydmbyx2#
Mixin应该被看作是一种方便的代码重用形式。
描述对象的某些行为并且也倾向于被一遍又一遍地复制的代码可以被认为是被收集/存储到mixin中。
使用JavaScript中的***基于函数的mixin-pattern***,人们还可以使用它的***有状态变体***,它为如何构建类型/对象架构提供了更多的可能性。
正如已经指出的那样,OP的示例在适合基于mixin的组合方面并不是很好。
然而,下一个给定的代码块确实尝试了一个稍微改变的示例,以演示在JavaScript中应用基于函数(有状态)的混合的不同方法......
你也可以考虑看一个更好的JavaScript示例,它也试图演示何时通过类扩展使用继承,何时不使用继承,何时只使用基于mixin/trait的组合,以及何时使用两者。
旁注-JavaScript中基于函数的Mixins / Traits / Talents的推荐资源
此外,我建议阅读我在SO上列出的一些答案,这些答案也与这个主题有关。