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]--> 
相关问题