2011-12-20 14 views
13

मॉड्यूल पैटर्न को लागू करते समय, निजी फ़ंक्शंस मॉड्यूल के निजी गुणों का उपयोग कैसे करते हैं? मैंने कोई उदाहरण नहीं देखा है जहां डेवलपर्स ऐसा करते हैं। क्या कोई कारण नहीं है?जावास्क्रिप्ट मॉड्यूल पैटर्न: निजी तरीके मॉड्यूल के दायरे तक कैसे पहुंचते हैं?

var module = (function(){ 
    // private property 
    var number = 0; 

    // private method 
    _privateIncrement = function(){ 
     // how do I access private properties here? 
     number++; 
    }; 

    // public api 
    return { 
     // OK 
     getNumber: function(){ 
      return number; 
     }, 
     // OK 
     incrNumber: function(){ 
      number++; 
     }, 
     // Doesn't work. _privateIncrement doesn't have 
     // access to the module's scope. 
     privateIncrNumber: function(){ 
      _privateIncrement(); 
     } 
    }; 
})(); 
+7

ठीक काम करता है: http://jsfiddle.net/DREKt/ यद्यपि आप संभवतः 'var' घोषणा के साथ '_privateIncrement' से पहले होना चाहते हैं। – Dennis

+0

यदि मॉड्यूल के बंद होने में 'संख्या' बाध्य नहीं था, और ऑब्जेक्ट का एक हिस्सा था, तो आपको सही संदर्भ में निजी विधि को आमंत्रित करने के लिए 'लागू()' या' कॉल() 'का उपयोग करने की आवश्यकता हो सकती है। '_privateIncrement.call (यह)' –

उत्तर

10

जब मॉड्यूल पैटर्न को लागू करने, कैसे निजी कार्यों के मॉड्यूल के निजी संपत्तियों उपयोग करते हैं?

गुण दायरे में हैं, इसलिए वे "बस कर"

काम नहीं करता।

हाँ, ऐसा करता है।

_privateIncrement मॉड्यूल के दायरे तक पहुंच नहीं है।

हाँ, ऐसा करता है।

निम्न में से live example देखें:

var module = (function(){ 
    // private property 
    var number = 0; 

    // global method 
    _privateIncrement = function(){ 
     number++; 
    }; 

    // public api 
    return { 
     // OK 
     getNumber: function(){ 
      return number; 
     }, 
     // OK 
     incrNumber: function(){ 
      number++; 
     }, 
     // Does work! 
     privateIncrNumber: function(){ 
      _privateIncrement(); 
     } 
    }; 
})(); 

// Show default value 
document.body.innerHTML += (module.getNumber()); 
// Increment 
module.privateIncrNumber(); 
// Show new value 
document.body.innerHTML += (module.getNumber()); 
// Increment (since _privateIncrement was defined as a global!) 
_privateIncrement(); 
// Show new value 
document.body.innerHTML += (module.getNumber()); 

// Output: 012 
+1

+1 हालांकि मुझे लगता है कि "निजी कार्यों को मॉड्यूल_ के निजी गुणों तक पहुंचने के तरीके से ओपी" कहकर ओपी सोचता है कि वह लौटाए गए ऑब्जेक्ट के गुणों का उपयोग करना चाहता है (उदाहरण के लिए। getNumber() 'विधि)' _privateIncrement() 'फ़ंक्शन के भीतर से। – Tadeck

+0

क्वांटिन सही है। मेरे सिस्टम में कहीं और एक बग था जो निजी चर को फेंक रहा था। धन्यवाद। – Thomas

3

एक वैकल्पिक this के उपयोग के साथ निजी तरीकों के लिए call या apply तरीकों का उपयोग करके है।

function Restaurant() 
{ 
    this.mongoose = 'beans'; 
    this.freedom = {bear:'love',a:'12'}; 

    var myPrivateVar; 

    var private_stuff = function() // Only visible inside Restaurant() 
    { 
     myPrivateVar = "I can set this here!"; 
     this.mongoose = 12; 
    } 

    this.use_restroom = function() // use_restroom is visible to all 
    { 
     private_stuff(); 
    } 

    this.buy_food = function() // buy_food is visible to all 
    { 
     private_stuff(); 
    } 

    private_stuff.call(this); 
} 

var bobbys = new Restaurant(); 

बेशक आप एक प्रोटोटाइप और private_stuff को use_restroom और buy_food कदम होगा निर्माता के बाहर अगर आप इस वस्तु के कई उदाहरण होने पर योजना बना रहे थे।

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