使用call方法调用hasOwnProperty作为直接静态引用的好处,而不是将其作为对象实例方法调用

时间:2013-07-26 17:05:04

标签: javascript

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

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

为什么它比调用对象实例的hasOwnProperty方法更受欢迎:

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

4 个答案:

答案 0 :(得分:5)

因为您可以创建一个如下所示的对象:

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

即。您可能会意外或故意重新定义该功能。

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

答案 1 :(得分:1)

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

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

在这个答案给出的例子中,JS引擎只是升级,因为有问题的对象是一个对象文字。如果您在构造的实例(例如Date对象)上对此进行测试,则引擎必须遍历原型链的更多级别才能获得适当的方法。对于大多数对象而言,这并不是很大的性能影响,实际上对于对象文字,it more performant on some engines to use the instance method as opposed to the statically called function,但是如果Object.prototype是原型链中的一个对象上面的几个层,那么性能命中变得更加可测量。

然而,

@Frits van Campens's answer没有水,因为人们也可以override Object.prototype.hasOwnProperty

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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