【问题标题】:Javascript: Object doesn't support method 'freeze'Javascript:对象不支持方法“冻结”
【发布时间】:2012-10-18 12:57:20
【问题描述】:

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

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

当方法 Object.freeze(FeatureName) 被调用时,它适用于除 IE7 和 IE8 之外的所有浏览器。有没有其他选择?

【问题讨论】:

  • this table 所示,那些浏览器太旧了,无法支持这个 EcmaScript 5 功能。
  • @Sats:你知道我是否可以为 Object.freeze 提供任何替代机制,或者我是否可以在对象原型中创建方法 freeze

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


【解决方案1】:

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 );
};

【讨论】:

  • 问题是这个实现使用的方法在IE8(当然还有IE7)中不可用。
  • @ColBeseder:试过了,但没用。它确实创建了原型方法,但现在出现错误“对象不支持属性或方法'getOwnPropertyNames'”。
  • 只需创建一个类似 function() {} 的虚拟对象。这将使错误消失,你可以继续你的生活,希望你的 javascript 不依赖 freeze 函数实际上做任何事情......
【解决方案2】:

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

虽然它不是真正的 polyfill;来自 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]-->

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多