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

Anu*_*jan 6 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);
Run Code Online (Sandbox Code Playgroud)

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

Col*_*der 5

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 );
};
Run Code Online (Sandbox Code Playgroud)

  • 只需创建一个类似function(){}的虚拟对象即可。这将使错误消失,您可以继续生活,希望您的JavaScript并不依赖冻结函数实际执行的任何操作... (2认同)

Ale*_*der 5

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

不过,这不是真正的 polyfill;来自 Github 上项目的 README:

对象冻结

在所有旧引擎上静默失败。这应该没问题,除非您依赖于这种方法的安全和保障规定,而您不可能在传统引擎中获得这些规定。

如果你想使用 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]-->
Run Code Online (Sandbox Code Playgroud)