2016-03-09 32 views
9

Ben aşağıdaki JavaScript dosyaları:ES6 modülleri ve miras

src/js/sınıfları/Lexus.js:

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

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

src/js/sınıfları/Mercedes.js:

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

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

src/js/sınıfları/Car.js:

0.123.
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(); 
    } 
    } 
} 

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

ilginç bir şey, ben araba sınıfına yaLexus veya Mercedes ithalat ve app.js fabrika yöntemini çağırırsanız - her şey gayet iyi çalışıyor ; ancakLexus ve Mercedes bir hata aldım Araç sınıfına hem içe eğer:

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

Ben neyi özlüyorsun?

+0

Onların orada inşa değiliz beri, app.js içinde Lexus ve Mercedes ithal etmek gerekirse emin değilim. –

+2

Hata aracın temelli olmadığından ve belirli marka sınıflarınızın dairesel olarak bağımlı olduğundan emin misiniz? – Binvention

+2

Her yeni ifadeden sonra davalara bir mola verirseniz ne olur?Düzenleme: nvm, bu nedenle, anahtarın kapsam dışına çıktığında geri döndüğünüzde, – xetra11

cevap

5

Genellikle, değil böyle dairesel bağımlılıkları istiyorum. Dairesel bağımlılıkları en iyi zamanlarda, her şeyi kırın ve derlemeyin (veya iletmeyin). onlar sadece iyi çalışıyormuş gibi duruncaya kadar bazı korkunç devlet varsayımlara yol açtığı bazı korkunç hata ile, bak, ayırt etmek gerçekten zor zamanlarda, sebep birleştirme ve sürüm çatışmaları, neden kodunun en kötü Dairesel bağımlılıklar. Çözümünüz (eğer bu kalıtım formunda ölü olarak ayarlanmışsanız), kendi dosya/sınıfına ayrı ayrı alınabilecek ve Fabrika'dan ayrı olmak için kendi sınıfına çıkarılacak. tam mantıklı İngilizce,

.
Otomobil Lexuses inşa yoktur (Lexi?). Eğer bu (değil iyi bir fikir) tutmak istiyorsanız eğer

Ayrıca, o zaman bir kayıt yöntemi, değil, "Lexus" kayıt sayede kodlanmış çözüm ve yeni kılan fonksiyonu olmalıdır 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; 

Daha da kötüye gidiyor, ancak bu zaten çok kötü. Başka yol giderseniz

: Artık

// 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"); 
} 

, hiçbir besledikleri olmamalıdır şeyleri bilmemiz gerekir.

+0

Arabam sınıfım 'diğer rotaya' gidersem nasıl görünmeli? – koryakinp

+0

@ user3715778 'sınıf Araba {yapıcı (make) {this.make = make; }} ' – Norguard

+0

ve Car.make() yönteminin nereden geliyor? – koryakinp