由于 hasOwnProperty 有一些警告和怪癖(窗口/广泛使用ie8问题/等)。
我想知道是否有任何理由甚至使用它,如果只是测试一个属性是否未定义是更合理的&更简单。
例如:
var obj = { a : 'here' };
if (obj.hasOwnProperty('a')) { /* do something */ }
if (obj.a !== undefined) { /* do something */ }
// or maybe (typeof (obj.a) !== 'undefined')
只是想知道是否有人对此有任何好的见解,我更愿意使用最流畅的浏览器友好和最新的方法。
我也看过这个原型覆盖了hasOwnProperty,它起作用了,但我没有卖掉它的实用性......
if (!Object.prototype.hasOwnProperty) {
Object.prototype.hasOwnProperty = function(prop) {
var proto = this.__proto__ || this.constructor.prototype;
return (prop in this) && (!(prop in proto) || proto[prop] !== this[prop]);
};
}
答案 0 :(得分:12)
hasOwnProperty方法检查该属性是否直接分配给对象。 因此,如果属性'a'在原型中,则hasOwnProperty将过滤该内容。
function NewClass() {}
NewClass.prototype = { a: 'there' };
var obj = new NewClass();
if (obj.hasOwnProperty('a')) { /* code does not work */ }
if (obj.a !== undefined) { /* code works */ }
因此,在许多情况下,hasOwnProperty更安全。
答案 1 :(得分:7)
hasOwnProperty不检查未定义的值只检查属性是否已分配给对象,即使未定义
var obj = { a : undefined };
obj.hasOwnProperty("a") //true
obj.a === undefined //true
obj.hasOwnProperty("b") //false
obj.b === undefined //true
答案 2 :(得分:3)
作为@Pavel Gruba给出的答案的进一步信息,以及您提供的polyfil。据我所知,对于不支持本机的浏览器,polyfil hasOwnProperty
没有好办法。我在野外看到了不少不同的东西,它们都会产生误报或否定。如果我绝对没有其他选择那么这就是我为我的用途创造的,它也会遭受误报和否定。根据{{3}}。
在以下文档模式中受支持:Quirks,Internet Explorer 6 标准,Internet Explorer 7标准,Internet Explorer 8 标准,Internet Explorer 9标准,Internet Explorer 10 标准。 Windows应用商店应用也支持。
的Javascript
function is(x, y) {
if (x === y) {
if (x === 0) {
return 1 / x === 1 / y;
}
return true;
}
var x1 = x,
y1 = y;
return x !== x1 && y !== y1;
}
function hasOwnProperty(object, property) {
var prototype;
return property in object && (!(property in (prototype = object.__proto__ || object.constructor.prototype)) || !is(object[property], prototype[property]));
}
function NewClass() {}
NewClass.prototype = {
a: 'there'
};
var obj = new NewClass();
if (obj.hasOwnProperty("a")) {
console.log("has property")
}
if (hasOwnProperty(obj, "a")) {
console.log("has property")
}
在MSDN
上