我了解到任何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
类型会更安全吗?
答案 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的原型是一个例外,没有自己的原型,因为它不需要。