2012-05-21 24 views
9

जब मैं इस मॉड्यूल के विभिन्न उदाहरणों को आजमाता हूं और करता हूं, तो यह काम नहीं करता है।मॉड्यूल पैटर्न एक सिंगलटन क्यों बनाता है?

ऐसा लगता है कि यह एक सिंगलटन है। मेरे पास एक समय में केवल एक उदाहरण हो सकता है।

क्या तंत्र केवल रचनात्मक फ़ंक्शन publik() को केवल उदाहरण के लिए सीमित करता है?

http://jsfiddle.net/AVxZR/

var Module = (function() 
{ 
    var publik = function () 
    { 
    }; 
    publik.prototype.test; 
    publik.prototype.get = function() 
    { 
     document.getElementById('a'+test).innerHTML = test; 
    }; 
    publik.prototype.set = function(value) 
    { 
     test = value; 
    }; 
    return publik; 
})(); 

var object1 = new Module(); 
var object2 = new Module(); 

object1.set('1'); 
object2.set('2'); 


object1.get(); 
object2.get(); 

उत्तर

5

संक्षिप्त उत्तर: बंद करें।

विस्तृत उत्तर है (अगर मैं इसे सही है, तो कृपया टिप्पणी तो मैं सही कर सकते हैं):

  1. आपका मॉड्यूल वर एक निष्पादित तुरंत जब स्क्रिप्ट लोड है। (फ़ंक्शन के चारों ओर कोष्ठक द्वारा दर्शाया गया है।)()

  2. उस मॉड्यूल में, आपका प्रकाशन var घोषित किया गया है और यह फ़ंक्शन पूरा होने पर भी बंद हो गया है!

  3. बाद की कॉल के साथ, आप अभी भी उस मॉड्यूल तक पहुंच सकते हैं जो स्वत: निष्पादित था। और यह हमेशा वही बंद स्थान और कार्यक्षेत्र और उसी वस्तु को प्राप्त करता है, संक्षेप में - इसलिए आपका प्रकाशन चर वास्तव में हमेशा एक ही होता है।

+0

तो हर बार जब मैं नया कहता हूं तो यह वास्तव में एक नया कार्य-वस्तु नहीं है, यह वही है? –

+1

हां।अधिक सही होने के लिए, जब आप फ़ंक्शन (फ़ंक्शन() {}()) पैटर्न में एक फ़ंक्शन संलग्न करते हैं, तो इसे स्वचालित रूप से लोड समय पर निष्पादित किया जाता है और परिणाम इसके स्थान पर रखा जाता है। तो अंत में आपकी स्क्रिप्ट (आंतरिक रूप से) var मॉड्यूल = YourObjectWithGetAndSetMethods की तरह दिखती है; और जब आप एक var x = मॉड्यूल() करते हैं; आप एक ऑब्जेक्ट को कॉल कर रहे हैं जो पहले से ही तत्काल है और इसलिए तत्काल प्रकाशन चर के साथ। – Zlatko

+0

मुझे एक फर्जी पैटर्न की तरह लगता है। यह "नया" कीवर्ड का अर्थ "टूटता है"। क्या आप सहमत हैं? यदि ऐसा है तो लोग इसका उपयोग क्यों करते हैं? मैंने स्पष्ट रूप से इसका आविष्कार नहीं किया था। –

4

ताकि आप इसका इस्तेमाल अलग-अलग विविधताएं बनाने के लिए कर सकते हैं मॉड्यूल वर्ग को फिर से लिखने की कोशिश करें। आप "परीक्षण" संपत्ति को स्थैतिक संपत्ति में बदलना चाहते हैं क्योंकि मैंने इसे आपके लिए बदल दिया है।

var Module = function(){} 

    Module.prototype.test; 
    Module.prototype.get = function() 
    { 
     document.getElementById('a'+this.test).innerHTML = this.test; 
    }; 
    Module.prototype.set = function(value) 
    { 
     this.test = value; 
    } 
+0

मैंने पहले इसका उपयोग किया है लेकिन शैली b.c. पसंद नहीं है। कोई व्यापक ब्रैकेट नहीं हैं। –

10

मॉड्यूल पैटर्न का वर्णन आपके द्वारा वर्णित तरीके से नहीं किया जाना है। इसका उपयोग एक मॉड्यूल बनाने और बाहरी कोड से राज्य को छिपाने के लिए किया जाता है, यानी आप एक सार्वजनिक इंटरफ़ेस का पर्दाफाश करते हैं जिसके साथ बाहरी कोड संचार कर सकता है लेकिन आप बाकी को छिपाते रहते हैं।

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

इसके अलावा, एक मॉड्यूल सिंगलटन माना जाता है; कई समान मॉड्यूल होने के लिए आपके कोड में दो समान कक्षाएं हैं ... समझ में नहीं आता है।

इस प्रकार एक मॉड्यूल पैटर्न कैसा दिखना चाहिए।

var Module = (function($) { 
    // the $ symbol is an imported alias 

    // private variable 
    var id = 0; 

    // private function 
    function increaseId() 
    { 
     return ++id; 
    } 

    // return public interface 
    return { 
     nextId: function() { 
      // we have access to the private function here 
      // as well as the private variable (btw) 
      return increaseId(); 
     } 
    } 
}(jQuery)); // we import jQuery as a global symbol 

Module.nextId(); // 1 
Module.nextId(); // 2 
Module.id; // undefined 
Module.increaseId(); // error 

तुम देखो .nextId() कैसे केवल सामने आ रहा है, लेकिन अन्य निजी चर/कार्य में से कोई भी।

1

आप कोड एक सिंगलटन नहीं बनाते हैं। यह केवल एक सिंगलटन की तरह कार्य करता है क्योंकि आपके test वैरिएबल एक वैश्विक चर है।

इस परिवर्तन को ठीक करने के लिए test से this.test ताकि चर प्रत्येक उदाहरण से जुड़ा हुआ हो।

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