2

在众多JavaScript 源代码中,我看到了Object.prototype.hasOwnProperty从静态引用调用的偏好,如下例所示:

var hasOwnProp = Object.prototype.hasOwnProperty;
//...
if ( hasOwnProp.call(myObj, 'prop') ) {
    doSomethingWith(myObj);
}

为什么它优于调用对象实例的hasOwnProperty方法:

//...
if ( myObj.hasOwnProperty('prop') ) {
    doSomethingWith(myObj);
}
4

4 回答 4

5

因为您可以制作如下所示的对象:

var obj = {
    hasOwnProperty: function () {
        throw new Error("you are ugly");
    }
};

IE。您可能会意外地或有意地重新定义该功能。

MDN 上的来源:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty#hasOwnProperty_as_a_property

于 2013-07-26T17:05:47.533 回答
1

表现。或者至少可能是性能。

hasOwnProperty方法直接附加到Object.prototype,因此当调用 时{}.hasOwnProperty('foo'),JavaScript 引擎首先直接检查该对象是否hasOwnProperty存在方法,如果该方法不存在,则再次沿原型链向上,检查其是否存在上一级。冲洗。重复。

在此答案中给出的示例中,JS 引擎仅升级,因为所讨论的对象是对象文字。如果您在构造的实例(例如 Date 对象)上对此进行测试,那么引擎必须遍历原型链的更多级别以获取适当的方法。这对大多数对象来说并没有太大的性能影响,实际上对于对象字面量,在某些引擎上使用实例方法而不是静态调用的 function性能更高,但是如果 Object.prototype 是对象之上的几层祖先在原型链中,性能影响变得更加可衡量。

然而, @Frits van Campens 的回答并不成立,因为也可以覆盖Object.prototype.hasOwnProperty.

于 2013-07-26T17:24:31.957 回答
0

除了使用 Object.prototype.hasOwnProperty,我们还可以使用对象字面量 ({}).hasOwnProperty.call(myObj, 'prop');

于 2013-07-26T18:46:14.040 回答
0

因为 hasOwnProperty 是一个函数,因此它可以被重新定义,而且当简单地在对象上调用它时,它不会在原型链上查找该属性,但在原型上调用它会做到这一点。

于 2013-07-26T18:58:16.437 回答