为什么我们在JavaScript中有Function.call?

时间:2016-01-15 09:06:33

标签: javascript

> Function.call == Function.prototype.call
true
> Function.prototype == Function
false

为什么Function.prototype.*方法存在为Function.*?这似乎不一致。

这不是任何其他主要类型的情况(Array.slice不存在但Array.prototype.slice确实存在。)

1 个答案:

答案 0 :(得分:18)

因为/usr/lib/gcc-cross/arm-linux-gnueabi/4.7/../../../../arm-linux-gnueabi/bin/ld: cannot find -lncurses collect2: Error 本身就是Function

的原型
Function

因此,console.log(Function instanceof Function); console.log(Object.getPrototypeOf(Function) === Function.prototype); s原型中的所有函数也可以在Function中使用。

引用the specification

  

函数原型对象本身就是一个Function对象(它的[[Class]]是"函数")

确认这一点的另一种方法是,

Function

这意味着console.log(Function.call === Function.prototype.call); 对象和Function.call对象是相同的。

Function.prototype.call

这意味着console.log(Function.hasOwnProperty('call')); 对象本身没有Function属性。

call

这意味着console.log(Function.prototype.hasOwnProperty('call')); 对象具有Function.prototype属性。

  

call不存在但Array.slice

因为Array.prototype.slice函数的原型是Array对象,而不是Function对象。

Array

这就是我们在console.log(Object.getPrototypeOf(Array) === Function.prototype); 函数上获得callapplybind等的原因。 Array对象已成为Array的原型,Array对象上也可以使用slice