ES 5 - 为什么Function.prototype对象没有属性原型?

时间:2015-12-03 11:03:33

标签: javascript constructor ecmascript-5

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

例如:

  • Object拥有财产prototype

  • Function拥有财产prototype

  • Person拥有财产prototype

但是,

  

> typeof Function.prototype

     

"function"

我有两个问题,

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

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

因此,对于以上两个问题,将Function.prototype设为Function.protoype类型会更安全吗?

enter image description here

2 个答案:

答案 0 :(得分:3)

  

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

为什么会这样,你期望它指向什么?它不是构造函数。 (事实上​​,对于ES6,many functions没有.prototype方法。

Function.prototype是一个可调用的对象(函数),这是相当奇怪的,实际上没有任何好处。它也可能是一个普通的对象。 “规范如此说明”就是我们所拥有的(另请参阅these three questions)。

  

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

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

答案 1 :(得分:1)

如果您比较JavaScript中常见类型的原型,您可以看到它们的原型是实际类型的实例:

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

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

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