2009-07-14 5 views
10

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

अब, हमेशा की तरह, IE कुंजी स्थिरांक का समर्थन नहीं करता तो

const T = 10; 

काम नहीं।

मैं स्वांग करने के लिए है कि लेकिन , हमेशा की तरह, आईई कि वाक्य रचना का समर्थन नहीं करता __defineGetter__ और __defineSetter__ के माध्यम से एक संपत्ति बना सकते हैं (आईई 8 Object.defineProperty है, लेकिन कस्टम वस्तु पर काम नहीं)।

कोई विचार?

उत्तर

11

"कोई समाधान नहीं" वास्तव में सबसे सुरक्षित समाधान है। अभी जावास्क्रिप्ट में स्थिरांक बनाने के लिए कोई अच्छी व्यवस्था नहीं है, लेकिन यदि आप उन्हें पहचानने में मदद करने के लिए एक सम्मेलन (कंसस्ट के लिए सभी कैप्स) स्थापित करते हैं और उन्हें स्वयं को ओवरराइट नहीं करते हैं तो आपके स्वयं के स्थिरांक सुरक्षित होंगे।

आप एक सार्वजनिक पुस्तकालय लिख रहे हैं और आप किसी को एक मूल्य को संशोधित तो आप एक समारोह के साथ दायरे को नियंत्रित करके एक निजी चर केवल अपने खुद के कोड के लिए सुलभ उपयोग कर सकते हैं के बारे में वास्तव में चिंतित हैं, तो:

(function() { 
    var MY_CONSTANT = 42; 
    alert(MY_CONSTANT); // alerts "42" 
    ...do other stuff in here... 
})(); 
alert(MY_CONSTANT); // alerts "undefined" because MY_CONSTANT is out of scope here 

तो एक डेवलपर जावास्क्रिप्ट में एक मान पढ़ सकता है ताकि डेवलपर उस मान को संशोधित कर सके।

+0

हाँ एक प्रकार का स्थिरांक परिभाषित करने के लिए एकमात्र क्रॉस-ब्राउज़र संगत तरीका है बंद करने का उपयोग करना और उस चर को एक्सेस करने के तरीकों को प्रदान करना (जैसे कि यह एक निजी चर था ...)। लेकिन मेरी समस्या डेवलपर उपयोगकर्ता को obj.MY_CONSTANT के रूप में स्थिर से मूल्य प्राप्त करने के लिए प्रदान करना था ताकि आपका बाद का समाधान फिट न हो। तो, अंत में, इसके लिए (आईई भी 8 बनाम) भयानक और असंगत ब्राउज़र हम डेवलपर को हमेशा खराब समाधान और हमारे समय बर्बाद करना चाहिए। जब एम $ समझ जाएगा कि वेब डेवलपर मानक चाहता है ????? – xdevel2000

+0

जब कोई एम $ और मानकों के बारे में शिकायत करना चाहता है तो मैं आमतौर पर ऑब्जेक्ट नहीं करूंगा, लेकिन इस मामले में यह अनुचित लगता है क्योंकि जावास्क्रिप्ट स्थिरांक किसी भी विनिर्देश का हिस्सा नहीं हैं, वे मोज़िला विशिष्ट हैं। – Prestaul

+0

हां, लेकिन मैं 'मानक डी फैक्टो' और कॉन्स से संबंधित था, __defineGetter__ और इसी तरह के लिए समर्थित हैं उदा। वेबकिट इंजन (क्रोम आदि) द्वारा। इसके अलावा XMLHttpRequest ऑब्जेक्ट एक डब्ल्यू 3 सी मानक नहीं है (इसका आविष्कार एम $ द्वारा किया गया था) लेकिन इसे सभी द्वारा अपनाया गया है। – xdevel2000

2

ध्यान दें कि निरंतर कुछ को परिभाषित करना वास्तव में सुनिश्चित करता है कि इसे ओवरराइट नहीं किया जा सकता है।

यदि आप वास्तव में कुछ स्थिर रूप से परिभाषित नहीं कर सकते हैं, तो बस इसे एक चर के रूप में परिभाषित करने और इसके मूल्य को एक बार सेट करने के बारे में क्या है। मुझे लगता है कि आप कोड लिख रहे हैं, ताकि आप सुनिश्चित कर सकें कि आप इसे ओवरराइट नहीं करते हैं ...

स्पष्ट रूप से आदर्श नहीं है, लेकिन इसे काम करना चाहिए।

4

जावास्क्रिप्ट में freeze() विधि है जिसका उपयोग वास्तविक स्थिरांक बनाने के लिए किया जा सकता है।

उपयोग:

var consts = {};     // Object to store all constants 
    consts.MY_CONSTANT= 6; 
    Object.freeze(consts);    // Make the consts truly read only 
    consts.MY_CONSTANT= 7;    // Trying to do this will give error 
5

Object.defineProperty तुम क्या चाहते है।

उदाहरण के लिए:

var obj = {}; 

Object.defineProperty(obj, 'key', { 
    enumerable: false, 
    configurable: false, 
    writable: false, 
    value: 'static' 
}); 

Wil मान के साथ "obj.key" परिभाषित करें "स्थिर" है और यह केवल पढ़ने के लिए किया जाएगा।

  • संख्यात्मक अर्थ यह है कि किसी वस्तु के गुणों की गणना करते समय यह दिखाया जाएगा (या नहीं)।
  • लिखने योग्य साधन यदि आप इसे पढ़ना चाहते हैं, तो आप झूठ बोलेंगे। लिखा न जाए।
  • गलत होने पर कॉन्फ़िगर करने योग्य यदि आप नहीं चाहते हैं कि यह ऑब्जेक्ट से हटाया जा सके।

संक्षेप में, उन्हें सभी को झूठी डालकर, आप वस्तु पर स्थिरांक बना रहे हैं। बीटीडब्ल्यू, उनके डिफ़ॉल्ट झूठ पर होना है।

तो प्रभावी रूप से यह कर:

Object.defineProperty(obj, 'property', { value: 'value'}); 

'obj' नामक मान 'मान' के साथ 'संपत्ति' पर एक निरंतर पैदा करेगा। या आप यह

function setConstant(obj, key, value) 
{ 
    Object.defineProperty(obj, key, {value: value }); 
} 

var obj = {}; 
setConstant(obj, "constantName", "constantValue"); 

इसे बहुत पठनीय बना देगा।

1

पुराना सवाल लेकिन आजकल आप कर सकते हैं बस उपयोग:

const MY_CONST = 10; 

MDN से:

स्थिरांक घोषणा एक मूल्य के केवल पढ़ने के लिए संदर्भ बनाता है। इसका मतलब यह नहीं है कि यह मान अपरिवर्तनीय है, बस परिवर्तनीय पहचानकर्ता को फिर से असाइन नहीं किया जा सकता है।

Supported by पहले से ही सभी मुख्य ब्राउज़रों।