【问题标题】:angular ie8 "Object doesn't support property or method 'hasOwnProperty'" workaroundangular ie8“对象不支持属性或方法'hasOwnProperty'”解决方法
【发布时间】:2013-12-28 08:08:51
【问题描述】:

我在 ie8 上使用 angular-1.2.1.js 并收到错误:

对象不支持属性或方法“hasOwnProperty” (在角度 ForEach 方法内)

function forEach(obj, iterator, context) {
  var key;
  if (obj) {
    if (isFunction(obj)){
      for (key in obj) {
        if (key != 'prototype' && key != 'length' && key != 'name' && obj.hasOwnProperty(key)) {
          iterator.call(context, obj[key], key);
        }
      }
    } else if ...

根据这个 stackoverflow post,hasOwnProperty 在 ie8 中不起作用(至少在 window 对象上不起作用)

我不确定事情是否很奇怪,因为我在 Windows 8 ie 上使用 ie8 模式,但是当我使用时 hasOwnProperty 可以工作

var a = {b:'c'}
a.hasOwnProperty('b')  //true

为什么 ie8 会报错,我该如何解决? 谢谢

【问题讨论】:

  • 尝试在真正的 IE8 上进行测试,在您无法信任的兼容模式下会发生很多愚蠢的事情。您能否使用forEach 提供您实际的代码?
  • 在 IE8 中,hasOwnProperty 不适用于 DOM 元素(或其他“宿主对象”,我猜)。
  • 奇怪的是 Angular 声称他们已经针对 IE8 进行了测试:docs.angularjs.org/guide/ie 但已知在具有 IE8 兼容模式的 IE11 中不起作用:github.com/angular/angular.js/issues/4137 解决方案是:Object.prototype.hasOwnProperty.call(obj, key)
  • @Jedininjaster 我不确定我是否正确,但是如果您检查了window 对象的hasOwnProperty 属性怎么办?如果它不存在,你定义它。类似window.hasOwnProperty = window.hasOwnProperty || function (key) { return Object.prototype.hasOwnProperty.call(window, key); };。这将在任何其他脚本之前放在页面上。之后任何尝试访问window.hasOwnProperty 方法的东西都将使用本机方法(如果已定义)或以不同方式执行相同操作的自定义方法。这有帮助吗?
  • @Neil 这取决于b 是什么。如果它是一个普通的 JavaScript 数据类型,它应该可以正常工作。如果是window 或其他宿主对象,例如Element,它可能没有那个方法。所以一般来说,解决方案是使用Object.prototype.hasOwnProperty.call(b, c);

标签: javascript internet-explorer internet-explorer-8 hasownproperty


【解决方案1】:

使用映射来转换受保护的语句:

 /* Check for existence */
 if (key != 'prototype' && key != 'length' && key != 'name' && obj.hasOwnProperty(key)) 
    {
    iterator.call(context, obj[key], key);
    }

到调度表:

 /* Map browser alias to stringified logic */
 var conditional = {"ie8": 
                    "key != 'prototype' && key != 'length' && key != 'name' && Object.prototype.hasOwnProperty.call(key, {})",

                    "w3c":
                    "key != 'prototype' && key != 'length' && key != 'name' && obj.hasOwnProperty(key)"
                   };

还有一项功能检查可供选择:

/* Ternary mapping of browser to logic */
var browser =  ("onpropertychange" in document) === true && (!!window.XDomainRequest) === true && (!!window.innerWidth) === false ? "ie8" : "w3c";

/* Evaluate valid result and pass to specified function */
if (eval(conditional[browser]) )
  {
  iterator.call(context, obj[key], key);
  }

参考文献

【讨论】:

    【解决方案2】:

    我也遇到了这个错误并在 angular.js Github Source 上找到了这个编辑来解决这个问题:

    if (obj) {
         if (isFunction(obj)){
           for (key in obj) {
    //-        if (key != 'prototype' && key != 'length' && key != 'name' && obj.hasOwnProperty(key)) {
    //+        // This uglyness around hasOwnProperty is for IE8 to work properly (hasOwnProperty doesn't exist)
    /*+*/        if (key != 'prototype' && key != 'length' && key != 'name' && (obj.hasOwnProperty && obj.hasOwnProperty(key) || Object.prototype.hasOwnProperty.call(obj, key))) {
               iterator.call(context, obj[key], key);
             }
           }
    

    还有一个编辑可以让 console.log 在 IE8 上工作 https://github.com/pjparra/angular.js/commit/bcbf9409f10f5988f6946a7b0381eee5e6518989

    来源:https://github.com/pjparra/angular.js/commit/8c2ed24412620d68a760cfab70e4dc27a49b9e91

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-05
      • 1970-01-01
      • 1970-01-01
      • 2018-08-29
      • 2017-01-27
      • 1970-01-01
      相关资源
      最近更新 更多