为什么typeof(Function.prototype)是函数

时间:2016-09-26 09:16:09

标签: javascript function.prototype

我知道Prototypes是对象字面的事实。因此可以在它们上定义方法和属性。 Function.prototype有一些方法,比如apply,call,bind,toString等。所以我认为函数的原型应该是一个对象文字。但我运行了以下代码并遇到Function.prototype属于类型函数

console.log(typeof(Function.prototype)); // function

为什么它本身不是对象文字?

3 个答案:

答案 0 :(得分:4)

来自the specification

  

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。 :)

嘿,嘿,请随便告诉我为什么这不是一个好的答案。我会尝试改进它。

相关问题