【问题标题】:why typeof(Function.prototype) is function为什么 typeof(Function.prototype) 是函数
【发布时间】:2016-09-26 18:00:19
【问题描述】:

我知道原型是对象字面量这一事实。因此可以在它们上定义方法和属性。 Function.prototype 有一些方法,如 apply、call、bind、toString 等。所以我认为函数的原型应该是对象字面量。但是我跑了下面的代码,发现Function.prototypetype function

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

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

【问题讨论】:

标签: javascript function.prototype


【解决方案1】:

来自the specification

函数原型对象是内部对象 %FunctionPrototype%。 函数原型对象本身就是一个内置函数对象。调用时,它接受任何参数并返回 undefined。 它没有 [[Construct]] 内部方法,因此它不是构造函数。

注意

函数原型对象被指定为函数对象,以确保与在 ECMAScript 2015 规范之前创建的 ECMAScript 代码兼容。

(我的重点)

如果我们转到 ES5 规范,it says

Function 原型对象本身就是一个 Function 对象(它的 [[Class]] 是“Function”),当被调用时,它接受任何参数并返回 undefined。

...没有提供任何解释为什么会这样。该语言在 ES1、ES2、ES3 和 ES5 中基本没有变化。我认为最初的想法基本上是这就是赋予它功能的原因,尽管typeof(即使在 ES1 中)没有查看内部的[[Class]],它查看了这个东西是否实现了[[Call]](如它仍然如此)。当事情一直追溯到 ES1 时,人们经常只需要调用“因为 Eich 在 10 天内完成了第一个 JavaScript,是的,当你这样做时会发生奇怪的事情”的论点。 :-)


旁注:我认为“对象文字”是指“普通对象”。 (“对象文字”——规范称为object initializer——只是在源代码中编写对象的一种方式。还有其他方法可以创建普通对象。)

【讨论】:

  • 如果它是一个函数对象,我可以像 Function.prototype() 那样调用它吗?
  • @AL-zami:确实可以;正如上面的引用所说,它所做的只是返回undefined
【解决方案2】:

对象字面量是一些用于创建对象的 JavaScript 语法。它不是数据类型。

函数只是 JavaScript 中一种特定类型的对象。任何可以拥有对象的地方,都可以拥有功能。

【讨论】:

  • 当他们说“对象文字”时,我认为 OP 只是意味着“对象”。就像很多人说JSON对象一样,其实不是这个意思,只是缺乏术语知识
【解决方案3】:

嗯,我不认为你的意思是 object literal,正如其他答案和 cmets 所暗示的那样。

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

一个快乐的大家庭,我们都是从 Object 中衍生出来的。为什么 Function 的原型不应该是函数?

现在,如果你想变得怪异……让我们变得怪异。

var notAFn = Object.create(Function.prototype);
alert(notAFn instanceof Function); // true
alert(typeof notAFn); // object

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

哦,嘿,请随时告诉我为什么这不是一个好的答案。我会努力改进的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2011-06-30
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多