【发布时间】:2018-03-29 11:04:08
【问题描述】:
我正在努力寻找一种好的做法或更好的方法来交流引用的“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的实例可能应该传递给Car。当然,您也可以颠倒关系并说Driver驱动Car。如何建模完全取决于您。 -
extend在显示的代码中没有意义,因为Car、Race或Driver这些类型彼此之间没有可以被描述为继承的关系。 -
并非如此。但是您的
Race对象可以作为事件广播器处理,并且所有汽车和驾驶员对象都可以将crash、stop、mount等事件发布到比赛中,并且任何其他对象(例如 Info 对象)都可以订阅对于比赛中的事件,并会被告知任何参与比赛的对象发生的事件。它基本上只是一个事件发射器和事件监听器。但正如我所说,这在很大程度上取决于确切的用例。 -
“但是这些嵌套类不是一个坏习惯,对吧?” 我不会称它们为“嵌套”。但不,这不是坏习惯。 OOP 就是对“事物”及其相互关系进行建模。
标签: javascript ecmascript-6 multiple-inheritance prototypal-inheritance es6-class