为什么对Function.prototype函数的引用不起作用

时间:2015-05-15 19:40:49

标签: javascript

为什么第二种情况不起作用?

// 1. works
Object.prototype.hasOwnProperty.call({a:1}, 'a');

// 2. does not work
var hasProp = Object.prototype.hasOwnProperty.call;
hasProp({a:1}, 'a');

http://jsbin.com/ramenaxame/2/edit?js,console

2 个答案:

答案 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)