为什么第二种情况不起作用?
// 1. works
Object.prototype.hasOwnProperty.call({a:1}, 'a');
// 2. does not work
var hasProp = Object.prototype.hasOwnProperty.call;
hasProp({a:1}, 'a');
答案 0 :(得分:4)
请注意,所有函数都共享相同的call
方法,继承自Function.prototype
。
Object.prototype.hasOwnProperty.call === Function.prototype.call // true
当您在某个函数上调用call
时,该函数将成为this
的{{1}}值,因此call
可以调用该函数。这是您的第一个代码的情况,它起作用。
但是,在您的第二个代码中,您不能将call
作为对象的方法。因此,其call
值在严格模式下为this
,在非严格模式下为全局对象。 undefined
和全局对象都不可调用,因此undefined
将抛出。
实际上,您的代码等同于
call
正如您所看到的,没有hasOwnProperty
的引用,因此它无法正常工作。
您可以使用var hasProp = Function.prototype.call;
hasProp({a:1}, 'a');
通过call
作为call
来调用hasOwnProperty
来解决此问题:
this
但更好的想法是创建一个行为类似于var call = Function.prototype.call;
call.call(Object.prototype.hasOwnProperty, {a:1}, 'a');
但其call
值绑定到this
的新函数。您可以使用bind
来实现此目的:
hasOwnProperty
答案 1 :(得分:4)
您可以通过这种方式分离方法以使其正常工作:
var hasProp = Function.call.bind(Object.prototype.hasOwnProperty)