0

実際の親クラスが定義されていないため、「兄弟クラスを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

私にはレースには1台以上の車があり、車にはドライバーがいるようです。したがって、 'Driver'のインスタンスはおそらく' Car'に渡されるべきです。もちろん、あなたはその関係を逆転させて、「ドライバー」が「カー」をドライブすると言うこともできます。これをモデル化する方法はあなた次第です。 –

+0

しかし、これらのネストされたクラスは悪い練習ではありませんか?私はちょうど拡張についての文書を見ているので、私の場合、彼らは他の人に継承される必要はない、ちょうど良い方法で接続されているように思えるので –

答えて

2

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でいくつかの利点や何か別の方法を期待していた。どうもありがとうございます –