4

我想創建一個Javascript的enummeration。 使用JavaScript代碼是Javascript:對象不支持方法'凍結'

var FeatureName = { 
"FEATURE1": 1, 
"FEATURE2": 2, 
"FEATURE3": 3, 
"FEATURE4": 4, 
"FEATURE5": 5 
} 
Object.freeze(FeatureName); 

當該方法Object.freeze(FeatureName),被稱爲它工作得很好除了IE7和IE8所有的瀏覽器。除此之外還有其他選擇嗎?

+4

http://kangax.github.com/es5-compat-table/兼容性圖表 –

+0

如[本表](http://kangax.github.com/es5-compat-table/)所示,這些瀏覽器太舊了,無法支持此EcmaScript 5功能。 – kapa

+0

@Sats:你有什麼想法,如果我可以有任何替代機制的Object.freeze,或者如果我能以某種方式凍結對象的原型 –

回答

3

John Resig提供了一種替代方案。我沒有在你提到的瀏覽器中試過它。試試吧,讓我們知道。

http://ejohn.org/blog/ecmascript-5-objects-and-properties/

Object.freeze = function(obj) { 
    var props = Object.getOwnPropertyNames(obj); 

    for (var i = 0; i < props.length; i++) { 
    var desc = Object.getOwnPropertyDescriptor(obj, props[i]); 

    if ("value" in desc) { 
     desc.writable = false; 
    } 

    desc.configurable = false; 
    Object.defineProperty(obj, props[i], desc); 
    } 

    return Object.preventExtensions(obj); 
}; 
+0

問題是,這種實現方法使用的方法在IE8中不可用當然還有IE7)。 – kapa

+0

@ColBeseder:試過了,但沒用。它確實創建了原型方法,但現在出現錯誤「對象不支持屬性或方法'getOwnPropertyNames'」。 –

+1

只需創建一個類似function(){}的虛擬對象。這將使錯誤消失,你可以繼續你的生活希望你的JavaScript不依賴於凍結功能實際上做任何事情... – oligofren

3

您可以添加包括es5-sham「猴子補丁」(僅需要包括es5-sham.min.js)您的網頁上,但要明白這只是防止錯誤出現是非常重要的。

雖然它不是一個真正的polyfill;從項目的Github上自述:

Object.freeze

靜靜地失敗對所有傳統的發動機。這應該沒有問題,除非您依賴於這種方法的安全和安全規定,而這在舊式引擎中是無法獲得的。

如果您想使用CDN,此庫也可從cdnjs獲取。

您可以包括它像這樣代碼(注意標籤將其限制在IE 8版本及以上)

<!--[if lt IE 9]> 
<script src="//cdnjs.cloudflare.com/ajax/libs/es5-shim/4.0.5/es5-sham.min.js" type="text/javascript"></script> 
<![endif]--> 
相關問題