2015-12-09 19 views
10

यह एक मुद्दा है जिसे मैं काफी बार चलाता हूं, और मैं इसे संभालने का सही तरीका खोजने की उम्मीद कर रहा था।ES6 परिपत्र निर्भरता

parent.js:

export default { 
    x: 1 
} 

a.js:

import parent from 'parent.js' 
export default parent.extend(a, { title: 'a' }) 

b.js:

तो मैं इस तरह एक सेटअप

import parent from 'parent.js' 
export default parent.extend(b, { title: 'b' }) 

कूल, अब मुझे कुछ बच्चे मिल गए हैं। लेकिन मुझे लगता है कि मैं parent.js में कोई फ़ंक्शन रखना चाहता हूं जो जांचता है कि कोई ऑब्जेक्ट या b का उदाहरण है या नहीं।

तो मैं यह कर सकता है:

parent.js:

import a from 'a' 
import b from 'b' 

export default { 
    x: 1, 
    checkType (obj) { 
    if (obj instanceof a) { 
     return 'a' 
    } else if (obj instanceof b) { 
     return 'b' 
    } 
    } 
} 

खैर अब है कि एक सर्कुलर निर्भरता है। क्या इसे संभालने का कोई शानदार तरीका है?

+0

'parent.extend' क्या है? और 'exampleof' कैसे काम करता है? क्या वहां नया है? – elclanrs

+0

क्षमा करें, और अधिक स्पष्ट होना चाहिए था। मैं ब्रेवटी के लिए बैकबोन-एस्क्यू प्रोटोटाइपिकल विरासत के किसी प्रकार का मान रहा हूं। – Hud

+2

क्या उस मुख्य मूल फ़ाइल में 'चेक टाइप' की आवश्यकता है? ऐसा लगता है कि यदि आप इसे एक अलग फ़ाइल में डालते हैं तो यह सब हल हो जाएगा। – loganfsmyth

उत्तर

2

यदि आप es6 कक्षाओं का उपयोग करने में सक्षम हैं, तो आप निर्माता में सुपर() कॉल का लाभ उठा सकते हैं।

Parent.js

export default class { 
    constructor(options, child) { 
     this.child = child; 
     this.x = 1; 
    } 

    checkType() { 
     return this.child; 
    } 
} 

A.js

import Parent from './Parent'; 

export default class extends Parent { 
    constructor(options) { 
     super(options, 'a'); 
    } 
} 

B.js

import Parent from './Parent'; 

export default class extends Parent { 
    constructor(options) { 
     super(options, 'b'); 
    } 
} 

आप के लिए नहीं करना चाहते हैं: मैं अक्सर कुछ इस तरह कर दूँगा कक्षाओं का उपयोग करें, शायद एक और एफपी शैली चाहते हैं। आप माता-पिता एक समारोह कर सकता है:

parent.js

export default function(child) { 
    return { 
     x: 1, 
     checkType (obj) { 
      return child; 
     } 
     extend (something) { 
      // assuming the returns something as you said 
     } 
    } 
} 

a.js

import parent from 'parent.js' 
export default parent('a').extend(a, { title: 'a' }) 

b.js

import parent from 'parent.js' 
export default parent('b').extend(b, { title: 'b' }) 
7

माता पिता वर्ग में तर्क करने के बाद कि बारे में पता है उप-वर्गों का एक गंभीर विरोधी पैटर्न है। इसके बजाय, उप-वर्गों में विधियों को जोड़ें जो प्रकार को वापस करते हैं।उदाहरण के लिए, a.js में:

import parent from 'parent.js'; 
export default parent.extend(a, { title: 'a', checkObj() { return 'a'; }}); 

तो checkObj से वांछित वापसी हमेशा की तरह, title संपत्ति का मूल्य है तो निश्चित रूप से बस:

// parent.js 
export default { 
    x: 1, 
    checkObj() { return this.title; } 
} 

मैं नहीं जानता कि वास्तव में क्या कर रही है extend यहाँ। मुझे लगता है कि यह किसी प्रकार का उप-वर्ग तंत्र है।

सामान्य रूप से, परिपत्र आयात निर्भरता, हालांकि वास्तव में आवश्यक होने पर उनके साथ निपटने के तरीके हैं, ब्रह्मांड आपको यह बताने की कोशिश कर रहा है कि जिस तरह से आपने अपना कोड संरचित किया है, उससे कुछ गड़बड़ है।

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