注意,所有功能共享相同的call
方法,从Function.prototype
继承。
Object.prototype.hasOwnProperty.call === Function.prototype.call // true
当你在一个函数中调用call
,该功能成为call
的this
值,所以call
可以调用函数。这是你的第一个代码,它的工作原理。
但是,在您的第二个代码中,不要将call
作为对象的方法。因此,其严格模式下的this
值将为undefined
,或者处于非严格模式的全局对象。 undefined
和全局对象都不能被调用,所以call
会抛出。
事实上,你的代码就相当于
var hasProp = Function.prototype.call;
hasProp({a:1}, 'a');
正如你所看到的,是hasOwnProperty
没有提及,所以它不能正常工作。
您可以修复使用call
与hasOwnProperty
调用call
作为this
值:
var call = Function.prototype.call;
call.call(Object.prototype.hasOwnProperty, {a:1}, 'a');
但是一个更好的想法是创建一个行为像call
而是有其必然hasOwnProperty
this
值的新功能。您可以使用bind
来实现这一目标:
var hasProp = Function.prototype.call.bind(Object.prototype.hasOwnProperty);
hasProp({a:1}, 'a');
笑,基本上我所看到的是''call.call(。 ..)''。这很有趣。 –
请忽略我以前的评论。这工作正常。 +1 –