2010-09-07 16 views
7

मैं Scrabb.ly के लिए जेएस स्रोत कोड देख रहा था।जावास्क्रिप्ट में इस डिजाइन पैटर्न को क्या जाना जाता है?

मैंने देखा है कि वे इसलिए उनके अलग "वर्गों" से प्रत्येक के लिए की तरह कुछ करना होगा:

var Board = (function() { 
    var self = {}; 

    // settings for board 
    self.options = { 
    debug: true, 
    addedPlayTiles: function() {}, 
    clearedPlayTiles: function() {} 
    }; 

    // set to true once the board has been setup 
    self.isSetup = false; 

    // quick access to square elements 
    self.squares = {}; 
    self.squareCount = 0; 

    self.setup = function(options) { 
    self.log("Setting up board!"); 

    // set options 
    _.each(options, function(val, key) { 
     self.options[key] = val; 
    }); 

    return self; 
})(); 

बीच हटा दिया गया है से कुछ कोड, लेकिन यह आप सामान्य विचार देना चाहिए।

  1. निम्नलिखित का उद्देश्य क्या है: (function() { // code })(); क्या यह मॉड्यूल पैटर्न है जिसके बारे में मैंने बात की है? क्या इसका मतलब वैश्विक नामस्थान को साफ रखना है?
  2. इस पंक्ति का क्या अर्थ है ?: var self = {} क्या स्वयं वस्तु 'सार्वजनिक' सदस्यों को उजागर करने के लिए उपयोग की जाती है? आप एक निजी फ़ंक्शन या चर को कैसे परिभाषित करेंगे?
  3. यदि आप चाहें तो आप "बोर्ड" को तुरंत कैसे चालू करेंगे?

उत्तर

11

इसे मॉड्यूल पैटर्न कहा जाता है।

फ़ंक्शन के चारों ओर कोष्ठक का मतलब है कि इसे परिभाषित करने के तुरंत बाद मूल्यांकन किया जा रहा है - इसलिए संक्षेप में यह सिंगलटन है। चूंकि यह एक अनाम कार्य है, परिभाषा संग्रहित नहीं है - इसलिए आप कुछ संशोधनों के बिना आसानी से इस ऑब्जेक्ट के नए उदाहरण नहीं बना सकते हैं (जिसे बाद में चर्चा की जाएगी)।

आप सही हैं, self में "सार्वजनिक" विधियां और गुण शामिल हैं, जैसा कि थे। self में परिभाषित नहीं किए गए किसी भी चर को बंद करने वाले गुणों के कारण बाहर दिखाई नहीं दे रहा है। हालांकि, self में परिभाषित किसी भी फ़ंक्शन के पास अभी भी निजी चरों तक पहुंच है क्योंकि जावास्क्रिप्ट में, फ़ंक्शंस संदर्भ (चर सहित) को एक्सेस बनाए रखते हैं जिसमें उन्हें परिभाषित किया गया था - कुछ अपवादों के साथ .. मुख्य रूप से arguments और this

यदि आप इस ऑब्जेक्ट के कई उदाहरणों को परिभाषित करना चाहते हैं, तो आप ब्रांड्स को हटा देंगे (var Board = function() { ... }) और फिर ऑब्जेक्ट बनाने के लिए var obj = Board() का उपयोग करें। ध्यान दें कि यह new ऑपरेटर का उपयोग नहीं करता है।

4

mentioned in the other answer के रूप में, यह मॉड्यूल पैटर्न है।

यह भी YUI मॉड्यूल पैटर्न या याहू मॉड्यूल पैटर्न के रूप में जाना जाता है जिसका मुख्य कारण यह इस ब्लॉग लेख द्वारा लोकप्रिय बनाया गया था:

बिंदु 3 के बारे में

द्वारा, मॉड्यूल पैटर्न का उद्देश्य सिंगलटन होना है। हालांकि, मॉड्यूल पैटर्न आसानी से एक कन्स्ट्रक्टर पैटर्न में बदल दिया जाता है। [पीपीटी] डगलस Crockford द्वारा

1

var self = {} एक खाली वस्तु शाब्दिक रूप में आरंभ स्वयं का प्रभाव होना चाहिए: आप इस विषय पर अधिक जानकारी के लिए Douglas Crockford द्वारा निम्न प्रस्तुतिकरण की जाँच कर सकते हैं ; यदि स्वयं पहले से मौजूद है, तो इसे पुराने मानों को हटा देना चाहिए और रिक्त सरणी के रूप में पुन: प्रारंभ करना चाहिए।

+1

मुझे लगता है कि आपका मतलब "ऑब्जेक्ट" नहीं है "सरणी"? –

+0

@ डैनियल वासलो: "ऑब्जेक्ट शाब्दिक", अच्छी पकड़ लें। –

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