函数对象的 prototype 属性供 new 调用时设置实例原型,而其自身通过 proto 指向 function.prototype 以继承 call、apply 等方法;function.prototype 是函数类型的原型,不可调用且无 prototype 属性。

所有函数对象的 prototype 属性默认指向一个普通对象,而这个普通对象的 constructor 指回该函数;更重要的是,**所有函数对象自身都继承自 Function.prototype**,这是通过它们的内部 [[Prototype]](即 __proto__)链建立的,不是靠 prototype 属性本身。
函数对象的 prototype 属性是给实例用的
prototype 是函数对象独有的属性,它的作用是:当该函数作为构造函数被 new 调用时,新创建的实例对象会把此 prototype 对象作为自己的原型(即实例的 __proto__ 指向它)。
-
function Foo() {}→Foo.prototype是一个普通对象,Foo.prototype.constructor === Foo -
const f = new Foo()→f.__proto__ === Foo.prototype - 这个
Foo.prototype对象本身也有原型:Foo.prototype.__proto__ === Object.prototype(因为它是普通对象)
函数对象自己从哪里来?—— Function.prototype 是它的隐式原型
函数也是对象,所以函数对象也需要有原型。JavaScript 规定:所有函数对象(包括内置函数如 Object、Array,也包括用户定义的函数)的 [[Prototype]] 都指向 Function.prototype。
-
function Foo() {}→Foo.__proto__ === Function.prototype✅ -
const arrFn = Array;→arrFn.__proto__ === Function.prototype✅ -
Function.__proto__ === Function.prototype✅(函数也是函数,自指)
也就是说,Function.prototype 是“函数类型”的原型,定义了所有函数共有的方法,比如 call、apply、bind。
Function.prototype 本身是个什么?
Function.prototype 是一个特殊的、不可调用的函数对象(其 typeof 是 "function",但调用会报错)。它没有自己的 prototype 属性(或者说不参与构造逻辑),它的 __proto__ 指向 Object.prototype:
Function.prototype.__proto__ === Object.prototypeObject.getPrototypeOf(Function.prototype) === Object.prototype-
Function.prototype.prototype是undefined(它不是用来做构造函数的)
关联图谱一句话总结
函数对象 F 的 prototype 属性服务于 new F() 创建的实例;而函数对象 F 自身,则通过 F.__proto__ 直接链接到 Function.prototype,从而获得函数行为能力。二者属于不同层级的原型关系:一个向外提供实例原型,一个向内确定自身类型。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











