在众多JavaScript sources中,我看到了从静态引用中调用Object.prototype.hasOwnProperty
的偏好,如下例所示:
var hasOwnProp = Object.prototype.hasOwnProperty;
//...
if ( hasOwnProp.call(myObj, 'prop') ) {
doSomethingWith(myObj);
}
为什么它比调用对象实例的hasOwnProperty
方法更受欢迎:
//...
if ( myObj.hasOwnProperty('prop') ) {
doSomethingWith(myObj);
}
答案 0 :(得分:5)
因为您可以创建一个如下所示的对象:
var obj = {
hasOwnProperty: function () {
throw new Error("you are ugly");
}
};
即。您可能会意外或故意重新定义该功能。
答案 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是一个函数,所以它可以被重新定义,并且因为当简单地调用该对象时它不会在该属性的原型链上查找,但是在原型上调用它将会这样做。