为什么在javascript中有Function.call?

为什么在javascript中有Function.call?,javascript,Javascript,为什么Function.prototype.*方法作为Function.*存在?这似乎前后矛盾 任何其他主要类型都不是这种情况(Array.slice不存在,但Array.prototype.slice存在)。因为函数本身就是函数的原型 > Function.call == Function.prototype.call true > Function.prototype == Function false 因此,Functions原型中的所有函数也可以在Function中找到 引

为什么
Function.prototype.*
方法作为
Function.*
存在?这似乎前后矛盾


任何其他主要类型都不是这种情况(
Array.slice
不存在,但
Array.prototype.slice
存在)。

因为
函数
本身就是
函数
的原型

> Function.call == Function.prototype.call
true
> Function.prototype == Function
false
因此,
Function
s原型中的所有函数也可以在
Function
中找到

引用

函数原型对象本身就是一个函数对象(其[[类]]是“函数”)


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

console.log(Function instanceof Function);
console.log(Object.getPrototypeOf(Function) === Function.prototype);
这意味着
函数.call
对象和
函数.prototype.call
对象是相同的

console.log(Function.call === Function.prototype.call);
这意味着
函数
对象本身没有
调用
属性

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

console.log(Function.hasOwnProperty('call'));

Array.slice
不存在,但
Array.prototype.slice
do

因为
Array
函数的原型是
function
对象,而不是
Array
对象

console.log(Function.prototype.hasOwnProperty('call'));

这就是为什么我们在
数组
函数上得到
调用
应用
绑定
等。它
数组
对象是
数组
的原型,那么
切片
也可以在
数组
对象上使用。

是的。函数是一个构造函数
Array.call==Function.call
。这类似于Java“Class”类吗?@valepu类,是的。如果JavaScript是一种基于类的语言,我们会说
函数
函数
的实例,但在Java中
不是
的实例(因为类通常不是
的实例或任何东西的实例)<代码>类仍然有一个奇怪的递归,因为它有一个关联的类对象,类型为
Class
,类型为
Class.Class==Class.Class.getClass()
。顺便说一句,我指的是Smalltalk。
class
的类是
class类
class类
的类是
元类
元类
的类是
元类类
元类类
的类是
元类
,因此关系实例包含循环。另外:
Class
Class
的一个子类,因此
Class
不仅仅是自身的一个实例,它还是自身子类的一个实例!好吧,这确实令人困惑!我甚至不知道我刚刚读到了什么