我知道Prototypes是对象字面的事实。因此可以在它们上定义方法和属性。 Function.prototype
有一些方法,比如apply,call,bind,toString等。所以我认为函数的原型应该是一个对象文字。但我运行了以下代码并遇到Function.prototype
属于类型函数!
console.log(typeof(Function.prototype)); // function
为什么它本身不是对象文字?
答案 0 :(得分:4)
Function原型对象是内部对象%FunctionPrototype%。 Function原型对象本身就是一个内置的函数对象。调用时,它接受任何参数并返回undefined。它没有[[Construct]]内部方法,因此它不是构造函数。
请注意
函数原型对象被指定为一个函数对象,以确保与ECMAScript 2015规范之前创建的ECMAScript代码兼容。
(我的重点)
如果我们转到ES5规范,it says:
Function原型对象本身就是一个Function对象(它的[[Class]]是“Function”),当被调用时,它接受任何参数并返回undefined。
......没有提供任何解释为何会出现这种情况。在ES1,ES2,ES3和ES5中,该语言基本没有变化。我认为最初的想法基本上就是那个赋予它功能性的东西,尽管typeof
(即使在ES1中)没有看到内部[[Class]]
,但它看着是否实现了{ {1}}(仍然如此)。当某些东西一直回到ES1时,人们常常只需要调用“因为Eich在10天内完成了第一个JavaScript,是的,当你这样做时会发生奇怪的事情”。 : - )
旁注:“对象文字”我认为你的意思是“普通对象”。 (“对象文字” - 规范称为object initializer - 只是在源代码中编写对象的一种方法。还有其他方法可以创建普通对象。)
答案 1 :(得分:1)
对象文字是用于创建对象的一些JavaScript 语法。它不是数据类型。
函数只是JavaScript中特定类型的对象。在任何可以拥有对象的地方,您都可以拥有一个功能。
答案 2 :(得分:-1)
好吧,我不认为你的意思是 object literal ,正如其他答案和评论所暗示的那样。
alert(Function.prototype instanceof Object) // true
alert(Function.prototype instanceof Function) // true
alert(typeof Function.prototype) // function

这是一个对象。它也是一种功能。此外,所有功能都是对象。他们都遵守规则就好了。
alert((function(){}) instanceof Object) // true
alert((function(){}) instanceof Function) // true
alert(typeof (function(){})) // function

一个很开心的我们所有派生对象家庭。为什么Function的原型不是函数?
现在,如果你想变得怪异...... 让它变得奇怪。
var notAFn = Object.create(Function.prototype);
alert(notAFn instanceof Function); // true
alert(typeof notAFn); // object

不,你不能打电话给notAFn()
。直到他们为此添加电话Symbol
。 :)