关于 Function.prototype 的疑问

经过测试

function fn(){}
console.log(fn.__proto__===Function.prototype)
// true
console.log(typeof Function.prototype)
//function

Function.prototype 是一个函数,既然是函数那么他也应该有自己的原型对象,因此 Function.prototype.prototype 应该是一个对象或者函数,但是测试后发现是 undefined
求大佬解答~

阅读 2.6k
4 个回答
Function.prototype 是一个函数,

是的

既然是函数那么他也应该有自己的原型对象

不是所有函数都有原型对象

因此 Function.prototype.prototype 应该是一个对象或者函数,但是测试后发现是 undefined

比如 Function.prototype 就没有。


typeof X 在 X 可以调用的时候(用标准的话说,有一个 [[Call]] 内置槽)返回 function 。与它的原型对象、原型链等等都无关。

Function.prototype是一个函数对象,从对象角度来理解,他是没有prototype属性的,只有__proto__属性,即它的原型是:

Function.prototype.__proto__

看看这个:https://zhuanlan.zhihu.com/p/40007030


总结

对象包含:__proto__、constructor

函数包含:__proto__、constructor和prototype

我们需要牢记两点:①__proto__和constructor属性是对象所独有的;② prototype属性是函数所独有的,因为函数也是一种对象,所以函数也拥有__proto__和constructor属性。(Object除外,他是所有对象最根部的原型,具有prototype属性)

__proto__属性的作用就是当访问一个对象的属性时,如果该对象内部不存在这个属性,那么就会去它的__proto__属性所指向的那个对象(父对象)里找,一直找,直到__proto__属性的终点null,再往上找就相当于在null上取值,会报错。通过__proto__属性将对象连接起来的这条链路即我们所谓的原型链。(instanceof这个方法就是针对__proto__属性,判断一个对象的原型链上是否具有某个对象的原型)

prototype属性的作用就是让该函数所实例化的对象们都可以找到公用的属性和方法。

constructor属性的含义就是指向该对象的构造函数,所有函数(此时看成对象了)最终的构造函数都指向Function。

凡事总有个源头终结点吧,他就是函数的鼻祖,开天辟地第一个函数就是他。

就像说对象都有原型一样,Object.prototype 就没有,因为它是对象的鼻祖,原型链的尽头,开天辟地第一个对象。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题