如何使用es6类的组合方式与本示例使用工厂函数的方式相同?
(请注意,这不是一个重复的问题,请参阅下面的@Jeff M的回答)如何使用es6类的组合方式与本示例使用工厂函数的方式相同?
我想了解es6类语法。我想撰写我的课以同样的方式,因为这代码并使用工厂函数:
例1:
const barker = (state) => ({
bark:() => console.log("Woof, I am " + state.name)
});
const driver = (state) => ({
drive:() => state.position = state.position + state.speed
});
const murderRobotDog = (name) => {
let state = {
name,
speed: 100,
position: 0
};
return Object.assign({},
barker(state),
driver(state)
);
};
const bruno = murderRobotDog("bruno");
bruno.bark(); // "Woof, I am Bruno"
使用“阶级”从一个完全不同的辅导班组成的我的工作示例如下所示:
例2:
class Employee {
constructor(firstName, familyName) {
this._firstName = firstName;
this._familyName = familyName;
}
getFullName() {
return `${this._firstName} ${this._familyName}`;
}
}
class Group {
constructor(manager /* : Employee */) {
this._manager = manager;
this._managedEmployees = [];
}
addEmployee(employee) {
this._managedEmployees.push(employee);
}
}
我能看到的组成概念是如何工作的,但这些似乎喜欢做的非常不同的方式。使用工厂的第一个例子似乎是最直观的,但我想使用es6类语法(不要担心为什么:)
也许我错过了一些东西,答案是显而易见的,但我该怎么做到底是什么在示例1中以最简单的方式使用es6类完成?谢谢。
我可以看到你正在使用MPJ的“合成”例子,所以你需要知道的第一件事是MPJ got composition completely wrong。 MPJ 实际上显示(没有他实现)是多重继承。这就是为什么有人已经将你的问题标记为另一个多重继承问题的可能重复。
JavaScript的原型链只支持单一继承,并且由于ES6类使用原型链,所以它们也仅支持单一继承。但与a little trick,我们仍然可以实现与多重继承相同的效果。
它会是这样的:
const barker = Sup => class extends Sup {
bark() { console.log("Woof, I am " + this.name) }
}
const driver = Sup => class extends Sup {
drive() { this.position = this.position + this.speed }
};
class murderRobotDog extends driver(barker(Object)) {
constructor(name) {
super();
this.name = name;
this.speed = 100;
this.position = 0;
}
};
const bruno = new murderRobotDog("bruno");
bruno.bark(); // "Woof, I am Bruno"
OMG谢谢!我几周来一直困惑这个问题,我几乎不敢相信我的英雄MPJ是错的,我的世界被吹散了! 我读了论坛的链接,但所有的例子不再在JS中。你能再帮我一次,并告诉我如何使用es6类中的PROPER组合来完成MPJ例子吗? – Sumomo
组合使用的实例变量是对其他对象的引用。像这个https://pastebin.com/Edqg9ZvX –
[ES6类的多重继承]的可能的复制(https://*.com/questions/29879267/es6-class-multiple-inheritance) – lilezek