【问题标题】:ES 5 - Why Function.prototype object does not have property prototype?ES 5 - 为什么 Function.prototype 对象没有属性原型?
【发布时间】:2015-12-03 11:03:33
【问题描述】:

我了解到任何function 类型的对象都具有prototype 属性。

例如:

  • Object 具有属性prototype

  • Function 具有属性prototype

  • Person 具有属性prototype

但是,

> typeof Function.prototype

"function"

我有两个问题,

1)为什么function类型对象Function.prototype没有自己的属性prototype,在下面的可视化中?

2) 任何对象通常都继承自object 类型对象,但在下面的可视化中,Function 对象和Person 对象继承自function 类型对象Function.prototype

那么,对于以上两个问题,将Function.protoype 设置为object 类型是否更安全?

【问题讨论】:

    标签: javascript constructor ecmascript-5


    【解决方案1】:

    为什么函数类型对象Function.prototype没有自己的属性prototype,在下面的可视化中?

    为什么会,你希望它指向什么?它不是构造函数。 (事实上​​,在 ES6 中,many functions 没有.prototype 方法)。

    Function.prototype 是一个可调用对象(函数),这很奇怪,实际上并没有任何好处。它也可能是一个普通的物体。 “规范是这么说的”就是我们所拥有的(另见thesethreequestions)。

    任何对象通常都继承自对象类型对象,但Function对象和Person对象继承自函数类型对象Function.prototype

    好吧,他们为什么不呢?正如您自己所说,函数只是对象,每个对象都继承自另一个对象(或null)。某些对象是可调用的(typeof 为它们生成 "function")对继承没有任何影响。

    【讨论】:

      【解决方案2】:

      如果你比较 JavaScript 中常见类型的原型,你会发现它们的原型是实际类型的一个实例:

      Function.prototype = function () {}
      Array.prototype = []
      Object.prototype = {}
      

      我不知道为什么会这样,但我想这是一个 ECMA 标准,或者它是浏览器为自己实现的东西,所以一切都有意义。换句话说,当 Function 的原型是像 Object 的原型这样的对象时,你怎么知道 Function 是 Function。 英语不是我的母语,但我希望我能说清楚。

      但是回答你的问题:我猜 Function 的原型是一个例外,没有自己的原型,因为它不需要。

      【讨论】:

      • Here's a relevant part of the spec:"Function.prototype的初始值为标准内置的Function原型对象"
      • @JamesThorpe 将Function.prototype 作为object 类型的对象来解决我的两个问题是否更安全?这样做有什么问题吗?
      猜你喜欢
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-30
      • 1970-01-01
      • 2021-09-19
      • 2013-02-27
      相关资源
      最近更新 更多