Javascript:对象不支持方法'冻结'

时间:2012-10-29 07:54:33

标签: javascript jquery internet-explorer-8 internet-explorer-7

我正在尝试在Javascript中创建一个枚举。 使用的javascript代码是

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

当调用方法 Object.freeze(FeatureName)时,它适用于除IE7和IE8之外的所有浏览器。有没有替代方案?

2 个答案:

答案 0 :(得分: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 );
};

答案 1 :(得分:3)

您可以在页面上添加es5-sham“monkey-patch”(只需要包含es5-sham.min.js),但重要的是要了解这只会阻止错误显示。

虽然这不是真正的填充物;来自项目的Github上的README:

  

<强> 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]-->