2010-03-11 14 views
20

संभव डुप्लिकेट:
Can Read-Only Properties be Implemented in Pure JavaScript?आप जावास्क्रिप्ट में केवल एक चर/ऑब्जेक्ट को कैसे पढ़ सकते हैं?

मैं एक वस्तु है कि मैं केवल चाहते हैं जब निर्माण से परिभाषित करने की है। मैं ऑब्जेक्ट संदर्भ को बदलने से कैसे रोक सकता हूं?

+0

http://stackoverflow.com/questions/366047/कैन-रीड-ओन-प्रॉपर्टी-इन-एन्टर-इन-शुद्ध-जावास्क्रिप्ट – spender

उत्तर

14
वास्तविक यह अधिलेखित नहीं द्वारा

...। आप इसे किसी ऑब्जेक्ट में लपेटकर एक्सेस को हमेशा नियंत्रित कर सकते हैं जो केवल SetObj के साथ GetObj प्रदान करता है, लेकिन निश्चित रूप से, रैपर ओवरराइटिंग के लिए समान रूप से उत्तरदायी है, जैसा कि इसके "निजी" सदस्य गुण हैं जो GetObj विधि के माध्यम से "छिपा" होगा।

दरअसल, सवाल एक शिकार है:

Can Read-Only Properties be Implemented in Pure JavaScript?

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

http://javascript.crockford.com/private.html पढ़ने के बाद, यह वैरिएबल संदर्भ कि वास्तव में बाहर की दुनिया से नहीं पहुंचा जा सकता बनाने के लिए बंद करने का उपयोग करना संभव है। उदाहरण के लिए:

function objectHider(obj) 
{ 
    this.getObject=function(){return obj;} 
} 

var someData={apples:5,oranges:4} 

var hider=new objectHider(someData); 

//... hider.getObject() 

जहां संदर्भ objectHider में obj को वस्तु निर्माण के बाद बदला नहीं जा सकता।

मैं इस के लिए एक व्यावहारिक उपयोग के बारे में सोच की कोशिश कर रहा हूँ।

+4

असल में 'hider.getObject'' कुछ डेटा 'ऑब्जेक्ट का संदर्भ देता है, और इसे * संशोधित किया जा सकता है, । उदाहरण के लिए: 'hider.getObject() सेब = 0;' 'तो hider.getObject();' एक ही संशोधित वस्तु वापस आ जाएगी, 'hider.getObject के बाद से() == someData' ... – CMS

+0

ज़रूर है, लेकिन यह है एक ही वस्तु मैंने केवल दावा किया कि इसका संदर्भ अपरिवर्तनीय था, इसकी गुण नहीं। अब, अगर कुछ डेटा ने भी व्यापक तकनीक लागू की है ...? – spender

+1

आपको काम करने के लिए ऑब्जेक्ट की गहरी प्रतिलिपि बनाने की आवश्यकता होगी। jQuery के विस्तार को ऐसा करने के लिए उपयोग किया जा सकता है: 'फ़ंक्शन (ओबीजे) {वापसी $ .extend ({}, obj); } ' – crush

42

वर्तमान व्यापक रूप से उपलब्ध कार्यान्वयन में, ECMAScript 3 वास्तविक अपरिवर्तनीयता के लिए कोई समर्थन नहीं है।

ECMAScript 5 मानक Object.seal और Object.freeze विधियों को जोड़ता है।

Object.seal विधि संपत्ति जोड़ कर पाएगा, अभी भी उपयोगकर्ता के लिए लिख सकते हैं या गुणों को संपादित करने की इजाजत दी।

Object.freeze विधि पूरी तरह से एक वस्तु लॉक हो जाएगा। वस्तुओं रहना होगा बिल्कुल के रूप में वे थे जब आप उन्हें फ्रीज और एक बार एक वस्तु जमे हुए किया गया है यह unfrozen नहीं हो सकता।

अंत में, के लिए वास्तविक वस्तु अचल स्थिति हम प्रतीक्षा करने के लिए जब तक ECMAScript 5.

अधिक जानकारी होगी:

+0

यदि आप ऑब्जेक्ट.फ्रीज़ (theObject) लौटाते हुए गेटर फ़ंक्शन बनाते हैं, तो गेटटर का उपयोग करते समय मूल ऑब्जेक्ट के मानों को बदलना संभव नहीं है। – Shahar

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