2016-03-09 16 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:

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

और 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 में कारखाने विधि कॉल - सब कुछ ठीक काम करता है ; लेकिन अगर मैं आयात दोनोंLexus और Mercedes कार वर्ग मैं एक त्रुटि मिल करने के लिए:

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

मैं क्या याद करते हैं?

+0

मुझे यकीन नहीं है कि आपको app.js में लेक्सस और मर्सिडीज आयात करने की आवश्यकता है, क्योंकि वे वहां नहीं बनाए गए हैं। –

+2

क्या आप सुनिश्चित हैं कि त्रुटि कार से अलग नहीं है और आपके विशिष्ट बनाने वाले वर्ग एक-दूसरे पर निर्भर परिपत्र हैं? – Binvention

+2

क्या होता है यदि आप प्रत्येक नए कथन के बाद मामलों में ब्रेक डालते हैं?संपादित करें: एनवीएम आप लौट रहे हैं इसलिए स्विच स्कोप से बाहर है – xetra11

उत्तर

5

आमतौर पर, आप पर इस तरह की परिपत्र निर्भरताएं चाहते हैं। सर्वोत्तम समय पर परिपत्र निर्भरता, सबकुछ तोड़ें और संकलित न करें (या पारदर्शी)। सबसे खराब समय पर सर्कुलर निर्भरता, मर्ज और वर्जनिंग विवादों का कारण बनती है, जो कोड को समझना मुश्किल है, ऐसा लगता है कि वे तब तक ठीक काम कर रहे हैं जब तक कि वे रुक जाए, कुछ भयानक स्थिति धारणाओं के कारण कुछ भयानक बग के साथ।

आपका समाधान (यदि आप विरासत के इस रूप में मृत हैं) तो अपनी खुद की फाइल/कक्षा में Car निकालने जा रहे हैं, जिसे अलग से आयात किया जा सकता है, और कारखाने को वर्ग से अलग किया जा सकता है।

जो अंग्रेजी में पूरी तरह से समझ में आता है।
कारें लेक्सस (लेक्सी?) का निर्माण नहीं करती हैं।

इसके अतिरिक्त, यदि आप इसे रखना चाहते हैं (एक अच्छा विचार नहीं), तो आपके पास एक रजिस्टर विधि होनी चाहिए, हार्ड कोड कोड नहीं, जिससे आप "लेक्सस" पंजीकृत करते हैं और यह फ़ंक्शन जो नया बनाता है लेक्सस।

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 'कक्षा कार {निर्माता (बनाना) {this.make = make; }} ' – Norguard

+0

और जहां से Car.make() विधि से आता है? – koryakinp

संबंधित मुद्दे