2016-03-09 15 views
9

私は、以下のJavaScriptファイルを持っている:ES6モジュールと継承

のsrc/JS /クラス/ Lexus.js:

import {Car} from 'src/js/classes/Car'; 

export class Lexus extends Car { 
    constructor() { 
    super("Lexus"); 
    } 
} 

のsrc/JS /クラス/ Mercedes.js:

import {Car} from 'src/js/classes/Car'; 

export class Mercedes extends Car { 
    constructor() { 
    super("Mercedes"); 
    } 
} 

のsrc/JS /クラス/ Car.js:

import {Lexus} from 'src/js/classes/Lexus'; //either of those imports works, but not both! 
import {Mercedes} from 'src/js/classes/Mercedes'; //either of those imports works, but not both! 

export class Car { 
    constructor(make) { 
    this.make = make; 
    } 

    static factory(msg) { 
    switch(msg) { 
     case "Lexus": 
     return new Lexus(); 
     case "Mercedes": 
     return new Mercedes(); 
    } 
    } 
} 

とapp.js:

import {Lexus} from 'src/js/classes/Lexus'; 
import {Mercedes} from 'src/js/classes/Mercedes'; 
import {Car} from 'src/js/classes/Car'; 

var car = Car.factory("Lexus"); 
console.log(car); 

興味深い、私は車のクラスにLexusまたはMercedesのいずれかをインポートし、app.jsでファクトリメソッドを呼び出す場合 - すべてが正常に動作します;私は車のクラスにLexusMercedesの両方をインポートする場合しかし、私はエラーを得た:

Super expression must either be null or a function, not undefined

私は何を欠場か?

+0

LexusとMercedesをapp.jsにインポートする必要があるかどうかは、そこでは構築されていないため、わかりません。 –

+2

エラーは、車とあなたの特定のクラスに基づいてお互いに循環依存していないと確信していますか? – Binvention

+2

新しい文のたびに改行を入れるとどうなりますか?編集:nvmあなたが戻ってスイッチが範囲外であるように返す – xetra11

答えて

5

通常、ではなく、にこのような循環依存関係があります。 時代遅れの循環依存関係は、すべてを壊し、コンパイルしない(またはトランスパイライズしない)。 最悪の時に循環依存関係が発生し、マージとバージョン管理の競合が発生し、ひどい状態の前提で引き起こされたひどいバグで、コードが停止してしまうまで、正常に動作しているように見えます。

解決策(あなたがこのような継承の形で死んでいる場合)は、独自のファイル/クラスにCarを抽出することです。これは別々にインポートすることができ、ファクトリをクラスから分離することになります。

英語では完全な意味があります。
車はレクサス(Lexi?)を構成しません。

さらにになった場合は、これを保存しておきたい(いい考えではありません)、ハードコーディングされたソリューションではなく、登録方法が必要です。これにより、「Lexus」と新しいレクサス

import Car from "./car"; 
class Lexus extends Car { 
    constructor() { 
    super("Lexus"); 
    } 
    // starting to look like a bad idea 
    static make() { 
    return Car.make("Lexus"); 
    } 
    // starting to look worse 
    static register() { 
    /* this register method does nothing, so that Lexus can't make other cars... */ 
    } 
} 

Car.register("Lexus",() => new Lexus()); 

export default Lexus; 

これは悪化しますが、これはすでにかなり悪いです。

あなたが他のルートに行く場合:

// carfactory.js 

const carTypes = new Map(); 
class CarFactory { 
    static register (name, implementation) { 
    carTypes.set(name, implementation); 
    return CarFactory; 
    } 
    static make (name) { 
    const makeCar = carTypes.get(name); 
    return makeCar(); 
    } 

    register (name, implementation) { 
    CarFactory.register(name, implementation); 
    return this; 
    } 
    make (name) { return CarFactory.make(name); } 
} 

export default CarFactory; 


// index.js 
import Car from "./classes/car"; 
import Lexus from "./classes/lexus"; 

import CarFactory from "./factories/car"; 

CarFactory 
    .register("Lexus",() => new Lexus()) 
    .register("Bentley",() => new Bentley()); 

init(CarFactory); 

function init (Car) { 
    const lexus = Car.make("Lexus"); 
} 

を今、何のクラスは、彼らがする必要はありません事を知る必要がありません。

+0

他のルートに行くと私の車クラスはどのように見えるはずですか? – koryakinp

+0

@ user3715778 'class Car {コンストラクタ(make){this.make = make; }} ' – Norguard

+0

、Car.make()メソッドの由来はどこですか? – koryakinp