的Javascript ES6类组成
问题描述:
我挣扎,这将是一个很好的做法或更好的方法“在ES6兄弟班”交流引用,因为他们没有真正的父类,顾名思义。的Javascript ES6类组成
让我更好地解释:
class Car {
constructor(typeOfMotor){
this.motor = typeOfMotor;
this.mount();
this.addListener();
}
mount() {
// Some async logic here, and this will return true or false;
}
addListener(driver) {
// Here i want to listen this.mount method and,
// when return true, then call the ride method in the driver
// If true:
driver.ride();
}
}
class Driver {
constructor(driverName) {
this.name = driverName;
}
ride(){
console.log('Highway to hell!');
}
}
class Race {
constructor() {
this.init();
}
init() {
this.car = new Car('v8');
this.driver = new Driver('michael');
}
}
var race = new Race;
race.car.addListener(race.driver);
所以基本上,我有一些环境中我不需要扩展类,因为我想保持他们作为封装成为可能。
,我有这个顶部类(不父,因为其他人都没有继承什么,虽然)。
而且问题很简单,这将是创建元素之间的这种沟通的最佳方式。
答
您可以将Driver
class
实例传递给Car
constructor
并调用此实例中的任何方法。
我会在这里重新考虑结构和业务逻辑,并检查什么样的责任每个组件应该处理。
例如,我认为它是由司机来决定当开车,但当然,当它准备的车应该发出信号。
因此,该车不应该调用driver.ride
,而只是发出信号告诉我正在驾驶的驾驶员并准备好前往,驾驶员应调用驾驶功能。
但这当然是有争议的。
这里是你的代码的运行例子(有点修改):
class Car {
constructor(typeOfMotor, driver) {
this.motor = typeOfMotor;
this.mounted = this.mount();
this.driver = driver;
}
mount =() => {
console.log('fetching data...');
setTimeout(() => {
this.drive()
}, 1500)
}
drive =() => {
// Here i want to listen this.mount method and,
// when return true, then call the ride method in the driver
// If true:
this.driver.ride();
}
}
class Driver {
constructor(driverName) {
this.name = driverName;
}
ride =() => {
console.log('Highway to hell!');
}
}
class Race {
constructor() {
this.init();
}
init =() => {
this.driver = new Driver('michael');
this.car = new Car('v8', this.driver);
}
}
var race = new Race();
+0
这就是我所做的,因为是我一直在ES5中做的事情,但我期待在ES6中有一些优点或类似的方法。非常感谢 –
有做,没有最好的方法。你想如何解决这个问题取决于实际情况。您可以执行发布订阅或基于事件的连接,使用回调或直接访问功能。或者所有这些的组合。 –
对我来说,似乎一场比赛有一辆或多辆车,一辆车有一名司机。所以'Driver'的一个实例应该被传递给'Car'。当然你也可以反转关系,并说一个'Driver'驱动一个'Car'。这真的取决于你如何建模。 –
但是这些嵌套类不是不好的做法,对吧?因为我只是看到关于扩展的doc,但在我的情况下似乎他们不需要被其他人继承,只是连接良好 –