2012-11-28 21 views
5

में परिभाषित विधियों के साथ जावास्क्रिप्ट मॉड्यूल पैटर्न बनाम कन्स्ट्रक्टर एक एकल उदाहरण और एक से अधिक उदाहरण बिंदु दृश्य से, मैं मॉड्यूल पैटर्न के बाद कोड की उन सभी अतिरिक्त पंक्तियों को क्यों लिखूं, केवल मानक कन्स्ट्रक्टर का उपयोग विधियों और गुणों के साथ निर्माता शरीर में?कन्स्ट्रक्टर

मॉड्यूल पैटर्न नमूना: http://jsfiddle.net/T3ZJE/1/

var module = (function() { 
    // private variables and functions 
    var foo = 'bar'; 

    // constructor 
    var module = function() { 
    }; 

    // prototype 
    module.prototype = { 
     constructor: module, 
     something: function() { 
     } 
    }; 

    // return module 
    return module; 
})(); 

var my_module = new module(); 

console.log(my_module) 


निर्माता नमूना: http://jsfiddle.net/EuvaS/2/

function Module(){ 

    // private variables and functions 
    var foo = 'bar'; 

    //public methods 
    this.something = function() { 

    }   
} 

var my_module = new Module(); 

console.log(my_module); 

मेरे लिए अंतिम परिणाम काफी एक ही है। दोनों में सार्वजनिक गुण और विधियां हो सकती हैं, दोनों में "निजी" चर और विधियां हो सकती हैं जिन्हें सार्वजनिक तरीकों से एक्सेस किया जा सकता है।

दोनों सिंगलटन के लिए एक बार सार्वजनिक/प्रोटोटाइप विधियों को परिभाषित करेंगे, दोनों ऑब्जेक्ट के कई उदाहरण/क्लोन के लिए उन्हें कई बार परिभाषित करेंगे।

क्या मुझे कुछ याद आ रही है? अंतर क्या है?

उत्तर

14

पहले उदाहरण में, foo मॉड्यूल() के सभी उदाहरणों के लिए एक स्थिर चर सामान्य होगा। मतलब, सभी उदाहरण एक ही चर का संदर्भ देंगे।

दूसरे उदाहरण में, प्रत्येक मॉड्यूल() उदाहरण के लिए foo अलग है।

इसके अलावा, मुझे कोई फर्क नहीं पड़ता।

+0

यह वास्तव में एक महत्वपूर्ण अंतर है। – Fergal

+1

कूप और गिगल्स के लिए, कन्स्ट्रक्टर विधि में यह मामूली संशोधन स्थिर निजी वर्र्स बनाएगा और केवल एक बार हमारे सार्वजनिक तरीकों को परिभाषित करेगा जबकि उन्हें कन्स्ट्रक्टर स्कोप में सभी निजी वर्र्स तक पहुंचने की अनुमति होगी: http://jsfiddle.net/zHwQX/2/ – Fergal

+0

@ फर्गल अच्छा बिंदु, वह भी नहीं देखा था। तो मुझे लगता है कि समग्र, अधिक कार्यक्षमता और छोटी मेमोरी पदचिह्न – Damp

0

कुछ खास अंतर नहीं। लेकिन मुझे यकीन नहीं है कि इस उदाहरण में मॉड्यूल पैटर्न का क्या मतलब है। आपको मॉड्यूल में कन्स्ट्रक्टर को शामिल करने की आवश्यकता नहीं है। रचनाकारों को दूसरी शैली की तरह इस्तेमाल किया जाना चाहिए। लेकिन इसके प्रोटोटाइप ऑब्जेक्ट में विधियों को परिभाषित करने के लिए बेहतर है जब तक कि आपको प्रत्येक इंस्टेंस के लिए इसे प्राप्त करने की आवश्यकता न हो।

फिर उद्देश्य के संदर्भ में, मुझे नहीं लगता कि यहां मॉड्यूल पैटर्न उचित तरीका है।

+0

मुझे उस स्निपेट को यहां से मिला: http: //briancray.com/posts/javascript-module-pattern – Fergal

+0

@ फर्गल वेल, मुझे यकीन नहीं है कि उनकी राय उचित है या नहीं पैटर्न। जैसा कि आपने मॉड्यूल में कन्स्ट्रक्टर रखने के अपने प्रश्न में उल्लेख किया है, वह अतिरिक्त काम है जो अनावश्यक है, मुझे लगता है। मुझे कोई योग्यता नहीं मिल रही है। –

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