2015-05-15 85 views

回答

4

注意,所有功能共享相同的call方法,從Function.prototype繼承。

Object.prototype.hasOwnProperty.call === Function.prototype.call // true 

當你在一個函數中調用call,該功能成爲callthis值,所以call可以調用函數。這是你的第一個代碼,它的工作原理。

但是,在您的第二個代碼中,不要將call作爲對象的方法。因此,其嚴格模式下的this值將爲undefined,或者處於非嚴格模式的全局對象。 undefined和全局對象都不能被調用,所以call會拋出。

事實上,你的代碼就相當於

var hasProp = Function.prototype.call; 
hasProp({a:1}, 'a'); 

正如你所看到的,是hasOwnProperty沒有提及,所以它不能正常工作。

您可以修復使用callhasOwnProperty調用call作爲this值:

var call = Function.prototype.call; 
call.call(Object.prototype.hasOwnProperty, {a:1}, 'a'); 

但是一個更好的想法是創建一個行爲像call而是有其必然hasOwnPropertythis值的新功能。您可以使用bind來實現這一目標:

var hasProp = Function.prototype.call.bind(Object.prototype.hasOwnProperty); 
hasProp({a:1}, 'a'); 
+1

笑,基本上我所看到的是''call.call(。 ..)''。這很有趣。 –

+0

請忽略我以前的評論。這工作正常。 +1 –

4

,可以分離的方法,這種方法以使其工作:

var hasProp = Function.call.bind(Object.prototype.hasOwnProperty) 
+0

就這樣說,'綁定'有點兒是「分離」的名稱,因此也就是名稱。你找回的函數帶着它的'this',所以從某種意義上來說,它更與一個特定對象綁定在一起。 – cHao

+0

這很有趣 – Anri

+0

請忽略我以前的評論。這工作正常。 +1 –

相關問題