2011-12-25 24 views
11

क्या गतिशील रूप से निजी चरों तक पहुंचने वाले मॉड्यूल-पैटर्न से सार्वजनिक फ़ंक्शन करने का कोई तरीका है? test1 चलता रहा "गतिशील पहुँच" के साथ लेकिन सार्वजनिक चरगतिशील रूप से मॉड्यूल पैटर्न में निजी चर का उपयोग करना संभव है?

var x = (function(){ 
    var x=0, y=2, z=5; 

    return { 
     toast: 123, 
     test1: function(arg){ 
      return this[arg]; 
     }, 
     test2: function(){ 
      // ?? 
     } 
    }; 
}()); 

console.log(x.test1("toast")); // 123 
console.log(x.test2("y")); // should return 2 

मैं एक ही निजी चर (एक वस्तु) बनाने के मेरे निजी चर संग्रहीत करें ताकि मैं उन्हें कि

की तरह उपयोग करने में सक्षम था के साथ समाप्त हो गया साथ क्या मतलब
privateVarStore[privateVarName] 

लेकिन क्या इसके लिए कोई और समाधान है?

उत्तर

9

DEMO

हां।

क्षमा एडम Rackis निराश लेकिन आप के साथ (बुराई) eval यह कर सकते हैं:

var x = (function(){ 
    var x=0, y=2, z=5; 

    return { 
     toast: 123, 
     test1: function(arg){ 
      return this[arg]; 
     }, 
     test2: function(a){ 
      return eval(a) 
     } 
    }; 
}()); 

console.log(x.test1("toast")); // 123 
console.log(x.test2("y")); // should return 2 -> does return 2 

यह उन कुछ अपवादों को छोड़कर जहां eval इस्तेमाल किया जाना चाहिए में से एक है। प्रति हंस बी PUFAL सुझाव (टिप्पणी), तो आपको और इस प्रकार test2 में पैरामीटर सत्यापित करना चाहिए कर सकते हैं के रूप में

संपादित करें,:

test2: function(a){ 
    return /^[$_a-z][$_a-z0-9]*$/i.test (a) ? eval(a) : undefined; 
} 
+3

पर सुरक्षा समस्याओं से बचने के लिए सलाह दी जाएगी कि सत्यापन 2 में पैरामीटर वास्तव में एक साधारण चर है: वापसी/^ [$ _ ए-जेड] [$ _ ए-जे 0-9] * $/i.test (ए)? eval (ए): अपरिभाषित; – HBP

+0

@ हंसबपुफल: बढ़िया विचार! मैं इसे – qwertymk

+1

+1 जोड़ना सुनिश्चित करूँगा, लेकिन क्या मैं एक वैकल्पिक सत्यापन विचार सुझा सकता हूं: यदि आप किसी ऑब्जेक्ट को परिभाषित करते हैं जो सूचीबद्ध करता है कि सार्वजनिक चर के माध्यम से कौन से निजी चर का उपयोग किया जा सकता है, जैसे 'var accessList = {" x " : सच, "वाई": सच}; फिर 'फ़ंक्शन टेस्ट 2 (ए)' में आप 'रिटर्न एक्सेसलिस्ट [ए] कह सकते हैं? eval (ए): अपरिभाषित; '- लाभ यह है कि न केवल यह सुरक्षा प्रदान करता है कि कौन से तारों को निकालने के लिए पारित किया जा सकता है, यह आपको अन्य सचमुच निजी चर परिभाषित करने की अनुमति देता है जिसे 'test2()' । – nnnnnn

7

नहीं (कम से कम eval प्रति क्यूर्टिम के जवाब का उपयोग किए बिना)।

yx की संपत्ति (इस वस्तु कुछ x की तुलना में बेहतर नामकरण स्थानीय चर x साथ भ्रम से बचने के लिए विचार) नहीं है। y एक स्थानीय चर है जिस पर x के तरीकों ने एक बंद कर दिया है।

x के तरीकों में से किसी भी y पहुंच सकते हैं, लेकिन this.y कह कर नहीं, बल्कि y सीधे एक्सेस करके।

फिर, y आपकी ऑब्जेक्ट x की संपत्ति नहीं है। यह उस फ़ंक्शन में केवल एक स्थानीय चर है जिसने x बनाया है, जिससे x के तरीकों को बंद करने के तरीकों का कारण बनता है।

तो, test2 पाने के लिए y वापस जाने के लिए, बस कार्य करें:

test2: function(){ 
    return y; 
} 

आप निजी चर का उपयोग करने की अनुमति देता है एक विधि बनाने के लिए, कुछ इस तरह विचार करें:

var x = (function() { 
    var privateMembers = { x: 0, y: 2, z: 5 }; 

    return { 
     getPrivate: function (name) { 
      return privateMembers[name]; 
     }, 
     toast: 123, 
     test1: function (arg) { 
      return this[arg]; 
     }, 
     test2: function() { 
      // ?? 
     } 
    }; 
})(); 

और तो

alert(x.getPrivate("y")); //alerts 2 

चेक बाहर this fiddle

+0

आप कैसे की सिफारिश करेंगे टिम 'test2 में लापता कोड हल करने के लिए()' ? – mauris

+0

बहुत अच्छा जवाब, लेकिन यह मेरा वैकल्पिक समाधान था (सार्वजनिक समारोह में मेरे निजी चरों तक पहुंचने के लिए एक निजी वस्तु बनाना), मैं सोच रहा था कि ऐसा करने के लिए कोई और (अधिक सुंदर) तरीका है या नहीं? –

+0

@ टिम - ऐसा नहीं है कि मैं सोच सकता हूं। निजी तौर पर, मुझे लगता है कि उपर्युक्त तरीका अधिक सुंदर है :) –