函数对象原型链为foo → function.prototype → object.prototype → null,因其是function实例且具构造函数功能;仅函数有prototype属性,用于new实例的原型继承。

函数对象的原型链和普通对象不同,它多了一层 Function.prototype,这是由函数的“双重身份”决定的:它既是可执行的函数,又是 Function 构造函数的实例。
函数对象的原型链结构
以一个普通函数为例:
function Foo() {}它的完整原型链是:
Foo → Function.prototype → Object.prototype → null
也就是说,函数对象本身是 Function 的实例,所以它的 __proto__ 指向 Function.prototype;而 Function.prototype 本身是个普通对象,所以它的 __proto__ 指向 Object.prototype;最后 Object.prototype.__proto__ 是 null,链终止。
为什么函数有 prototype 属性,但普通对象没有?
只有函数(除箭头函数外)才有 prototype 属性,因为这个属性只在函数被用作构造函数时才起作用——它定义了将来用 new Foo() 创建的实例的原型。
-
Foo.prototype是给new Foo()出来的实例用的,不是给Foo自己用的 -
Foo.__proto__才是Foo自己的原型,指向Function.prototype -
Foo.constructor指向Function,印证了它是Function的实例
验证方式
可以在控制台运行这几行代码确认:
function Foo() {}console.log(Foo.__proto__ === Function.prototype); // true
console.log(Foo.__proto__.__proto__ === Object.prototype); // true
console.log(Object.prototype.__proto__); // null
对比其他对象类型
不同对象的原型链终点一致,但起点和中间环节不同:
- 普通对象
{}:{} →Object.prototype→null - 数组
[1,2]:[1,2] →Array.prototype→Object.prototype→null - 函数
function f(){}:f →Function.prototype→Object.prototype→null
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











