的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); 

所以基本上,我有一些环境中我不需要扩展类,因为我想保持他们作为封装成为可能。

,我有这个顶部类(不父,因为其他人都没有继承什么,虽然)。

而且问题很简单,这将是创建元素之间的这种沟通的最佳方式。

+2

有做,没有最好的方法。你想如何解决这个问题取决于实际情况。您可以执行发布订阅或基于事件的连接,使用回调或直接访问功能。或者所有这些的组合。 –

+2

对我来说,似乎一场比赛有一辆或多辆车,一辆车有一名司机。所以'Driver'的一个实例应该被传递给'Car'。当然你也可以反转关系,并说一个'Driver'驱动一个'Car'。这真的取决于你如何建模。 –

+0

但是这些嵌套类不是不好的做法,对吧?因为我只是看到关于扩展的doc,但在我的情况下似乎他们不需要被其他人继承,只是连接良好 –

您可以将Driverclass实例传递给Carconstructor并调用此实例中的任何方法。

我会在这里重新考虑结构和业务逻辑,并检查什么样的责任每个组件应该处理。
例如,我认为它是由司机来决定开车,但当然,当它准备的车应该发出信号。
因此,该车不应该调用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中有一些优点或类似的方法。非常感谢 –