2009-07-14 74 views
10

我正在設計一些類和一些數據,我想使用常量字段。現在如何在javascript中創建常量

像往常一樣,IE不支持的關鍵常量所以

const T = 10; 

無法正常工作。

我可以通過__defineGetter____defineSetter__創建屬性與mime如此,但 ,像往常一樣,IE不支持這種語法(IE 8有Object.defineProperty但自定義對象無法正常工作)。

有什麼想法?

回答

11

「沒有解決方案」真的是最安全的解決方案。現在,在Javascript中沒有一個好的機制來創建常量,但是如果你建立一個約定(ALL CAPS FOR CONSTS)來幫助識別它們,而不是自己覆蓋它們,那麼你自己的常量將是安全的。

如果你正在編寫一個公共圖書館,你真的很擔心有人修改的值,那麼你可以通過一個功能控制範圍只使用自己的代碼訪問的私有變量:

(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 

如果開發人員可以在javascript中讀取值,然後開發人員可以修改該值。

+0

是唯一的跨瀏覽器兼容的方式來定義一種常量是使用閉包並提供訪問該變量的方法(就像它有一個私有變量一樣)。但我的問題是提供開發人員用戶從常量中獲取值作爲obj.MY_CONSTANT,因此您的後一種解決方案不適合。所以,最後,爲此(IE也是8版本),我們開發人員可怕和不兼容的瀏覽器必須總是找到糟糕的解決方案並浪費我們的時間。當M $明白Web開發人員想要標準時? – xdevel2000 2009-07-16 14:52:24

2

請注意,將某些常數定義爲確保它不能被覆蓋。

如果你真的不能定義一個常量,那麼把它定義爲一個變量並設置它的值一次。我假設你正在編寫代碼,所以你可以確保你不會覆蓋它...

顯然不理想,但它應該工作。

4

Javascript中有一個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' 
}); 

威爾界定 「obj.key」 具有值: 「靜態」,這將是隻讀的。

  • Enumerable表示在枚舉對象的屬性時它將顯示(或不顯示)。
  • 可寫的手段,如果你想它只是只讀,你會說假。不可寫。
  • 如果您不希望它可從對象中刪除,則可配置爲false。

實質上,通過將它們全部設置爲false,即可在該對象上創建常量。順便說一句,他們的默認值是假的。

所以有效地這樣做:

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所有的主要瀏覽器已經。