2012-01-19 30 views
5

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

इस काम को कुछ क्यों पसंद नहीं है, क्या यह पूर्ण और कुल बकवास है?

var HOUSE = function() { 
    return { 
     Person: function() { 
      var self = this; 
      self.name = "john"; 
      function name() { 
       return self.name; 
      } 
     } 
    }; 
}(); 

var me = new HOUSE.Person(); 
alert(me.name()); 
+0

'self.name' एक स्ट्रिंग' "जॉन" है 'ताकि आप इसे आह्वान नहीं कर सकते। ध्यान दें कि आपका स्थानीय फ़ंक्शन 'नाम' कहीं भी निर्यात नहीं किया गया है। – Raynos

+0

अद्यतन प्रश्न, लेकिन यह एक पूरी तरह से अच्छा जवाब दिया कोई मतलब नहीं है तो इसे वापस बदल दिया। – zode64

उत्तर

1

आपको विधि को बाहर लाने की आवश्यकता है, और इसे व्यक्ति प्रोटोटाइप से जोड़ना होगा। लेकिन जब आप करते हैं, आप एक नाम संपत्ति, और एक नाम विधि है, जो काम नहीं करेगा होगा, इसलिए बाद

HOUSE.Person.prototype.getName = function(){ 
    return this.name; 
} 

का नाम बदलने पर विचार या, तुम बस this में अटैच कर सकता है, और getName एक बनाने के विशेषाधिकार प्राप्त विधि:

Person: function() { 
     this.name = "john"; 
     this.getName = function() { 
      return this.name; 
     } 
    } 
+0

मुझे लगता है कि आपके पास थोड़ा वाक्यविन्यास मुद्दा है। :) – pimvdb

+0

तो 'var self = this' असाइन करना ताकि मैं बदल नहीं पा रहा हूं? – zode64

+0

यह भी अच्छा अभ्यास के रूप में सोचा है? – zode64

2

var और function foo() {} (एक घोषणा, जिसका अर्थ है "बस" function foo() {} बिना निर्दिष्ट किए के रूप में उत्तरार्द्ध) का उपयोग करना, स्थानीय प्रतीक बनाने। तो, समारोह कन्स्ट्रक्टर के बाहर उपलब्ध नहीं है।

तुम जो भी बेनकाब करने के लिए (सार्वजनिक करना) (जब से तुम self = this परिभाषित या self), तो आपको this को आवंटित करने चाहिए हैं:

self.getName = function() { 
    return self.name; 
}; 

ध्यान दें कि आप पहले से ही name इस्तेमाल किया, तो मैं समारोह एक और नाम दिया। यदि आप name स्ट्रिंग स्थानीय बनाना चाहते हैं, और फ़ंक्शन का पर्दाफाश करना चाहते हैं, तो उनके पास एक ही नाम हो सकता है क्योंकि कोई संघर्ष नहीं है। उदा .:

var name = "john"; 

self.name = function() { 
    return name; 
}; 
3

आपका कोड लगभग ठीक है। हालांकि फ़ंक्शन name() सार्वजनिक नहीं था लेकिन चर था इसलिए आप एक त्रुटि उत्पन्न करने वाले चर को निष्पादित करने का प्रयास कर रहे थे। वस्तु पर समारोह getName जोड़ें और कि बजाय फोन:

var HOUSE = function() { 
    return { 
     Person: function() { 
      var self = this; 
      self.name = "john"; 
      self.getName = function() { 
       return self.name; 
      } 
     } 
    }; 
}(); 

var me = new HOUSE.Person(); 
alert(me.getName()); 

http://jsfiddle.net/8nSbP/

+1

के अंदर 'foo' होगा' क्या यह अच्छा अभ्यास के रूप में सोचा गया है? – zode64