【发布时间】: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