2013-08-22 11 views
16

के साथ मॉड्यूल पैटर्न का खुलासा करना मुझे इसे लागू करने का सबसे अच्छा तरीका पता लगाने में कुछ परेशानी हो रही है।एक निर्माता

मैं एक मॉड्यूल चाहता हूं जिसमें एक कन्स्ट्रक्टर है जो तर्क में पड़ता है जो मॉड्यूल के भीतर बाद में उपयोग के लिए संग्रहीत करता है।

var ModuleB = function(moduleA) { 
    this.moduleA = moduleA; 
} 

ModuleB.prototype = function() { 
    //private stuff/functions 
    function someMethod() { 
     moduleA.doSomething(); 
    } 

    //public api 
    return { 
     someMethod : someMethod 
    }; 
}(); 

कुछ अन्य फ़ाइल

//ModuleA defined elsewhere 
var moduleA = new ModuleA(); 

//... 

var module = new ModuleB(moduleA); 
module.someMethod(); 

अब someMethod में ऊपर में, moduleA अपरिभाषित है, और this, वैश्विक खिड़की वस्तु है। क्या कोई समझा सकता है कि मुझे मॉड्यूल ए तक कैसे पहुंचाया जा सकता है? मुझे समझ में नहीं आता कि कन्स्ट्रक्टर के बाद this.moduleA = moduleA; क्या होता है। मैं वास्तव में एक जावास्क्रिप्ट डेवलपर इसलिए यदि मैं गलत पैटर्न यहाँ उपयोग कर रहा हूँ या कुछ और नहीं कर रहा हूँ, झंकार के लिए स्वतंत्र महसूस

+0

मैंने इसे अधिक स्पष्ट बनाने के लिए उदाहरण अपडेट किया –

+1

@ एकमात्र कारण यह है कि बेवकूफ काम करता है क्योंकि 'मॉड्यूलए' वैश्विक है। – jbabey

उत्तर

10

आप बहुत करीब हैं, लेकिन आप कर रहे हैं someMethod की आपकी परिभाषा में कुछ महत्वपूर्ण याद आ रही है।

संपादित करें:

var ModuleA = function() {} 

ModuleA.prototype = (function() { 
    return { 
     someMethod: function() { 
      return 'foo'; 
     } 
    }; 
}()); 

var ModuleB = function(moduleA) { 
    this.innerModule = moduleA; 
} 

ModuleB.prototype = (function() { 
    return { 
     doStuff: function() { 
      return this.innerModule.someMethod(); 
     } 
    }; 
}()); 

var moduleA = new ModuleA(); 

var moduleB = new ModuleB(moduleA); 
console.log(moduleB.doStuff()); // prints "foo" 

http://jsfiddle.net/mN8ae/1/

+0

आपके उदाहरण के लिए धन्यवाद। मेरी वास्तविक दुनिया की स्थिति में 'यह' ऑपरेटर हमेशा मॉड्यूलबी ऑब्जेक्ट नहीं है (आईडीके, शायद मुझे लगता है कि मेरे द्वारा खराब डिजाइन)। क्या इस मामले में उन मामलों के लिए काम करने के लिए मैं कुछ बदलाव कर सकता हूं? या मैं मॉड्यूलबी को लागू करने वाले क्षेत्रों को बदलने से बेहतर होगा। उदाहरण यहां http://jsfiddle.net/QKZxh/1/ –

+2

प्रोटोटाइप पर फ़ंक्शन हमेशा कॉलिंग ऑब्जेक्ट में 'यह' बिंदु होना चाहिए – jbabey

1

इस प्रयास करें:।

var ModuleB = function(moduleA) { 
    this.moduleA = moduleA; 
} 

// Simplifying your code, what was missin is the "this" keyword accessing the moduleA 
ModuleB.prototype.someMethod = function() {  
    this.moduleA.doSomething(); 
}; 


var module1 = new ModuleB({ 
    doSomething: function(){ 
     alert('i do something'); 
    } 
}); 

module1.someMethod(); 
+1

उसका प्रोटोटाइप असाइनमेंट एक आईआईएफई (एक वस्तु) की वापसी है, न कि एक समारोह। – jbabey

+0

हां, लेकिन जैसे ही आपने मॉड्यूलबी बनाया है, इसमें "प्रोटोटाइप" शामिल है। यदि आप संपूर्ण ऑब्जेक्ट को ओवरराइट करते हैं, तो मॉड्यूलए के सभी जादू संदर्भ –

+0

'मॉड्यूलए' प्रत्येक ऑब्जेक्ट इंस्टेंस की एक संपत्ति है, इसका प्रोटोटाइप से कोई लेना देना नहीं है। – jbabey

0

आप कॉल का उपयोग करने की आवश्यकता होगी/लागू होते हैं: बताने के लिए क्या काम करता है और क्या नहीं करता है, तो आप ModuleB में मॉड्यूल संपत्ति का नाम बदलने करता है आसान है है दिए गए संदर्भ के लिए विधि निष्पादित करने के लिए।

इस कोड (अपने कोड मैं संशोधित किया है) की कोशिश

var ModuleB = function(moduleA) { 
    this.moduleA = moduleA; 
     }; 

ModuleB.prototype = function() { 
    //private stuff/functions 
    function someMethod() { 

     this.doSomething(); 
    } 

    //public api 
    return { 
     someMethod : someMethod 
    }; }(); 


var ModuleA=function(){ 
    this.doSomething=function(){ 
     alert('moduleA Method'); 
    }; }; 

var modA=new ModuleA(); var modB=new ModuleB(modA); 
modB.someMethod.call(modA); 

धन्यवाद!

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