3

我在 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 ...

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

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

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

为什么ie8会抛出错误,我该如何解决?谢谢

4

2 回答 2

0

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

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

参考

于 2014-11-11T21:49:00.453 回答
0

我也遇到了这个错误并在 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

于 2015-06-11T07:52:48.240 回答