注意,所有功能共享相同的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 –