22

由于hasOwnProperty有一些注意事项和怪癖(在 Internet Explorer 8 问题中的窗口/广泛使用等):

有什么理由甚至使用它吗?如果只是测试一个属性是否未定义,是否更合理和更简单?

例如:

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

3 回答 3

19

hasOwnProperty 不检查未定义的值。它仅检查是否将属性分配给对象,即使未定义:

var obj = { a : undefined };
obj.hasOwnProperty("a") // true
obj.a === undefined     // true
obj.hasOwnProperty("b") // false
obj.b === undefined     // true
于 2015-03-26T06:52:10.610 回答
18

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 在许多情况下更安全。

于 2013-06-17T15:09:31.030 回答
4

作为Pavel Gruba 给出的答案以及您提供的 polyfil 的更多信息:

hasOwnProperty据我所知,对于原生不支持它的浏览器,没有很好的方法来 polyfil 。我在野外见过很多不同的,它们都会产生误报或误报。如果我绝对别无选择,那么这就是我为自己使用而创建的,但它也会遭受误报和误报。根据MSDN

支持以下文档模式: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")
}

在 JSFiddle 上

于 2013-06-17T15:26:59.743 回答