function.prototype.__proto__ 指向 object.prototype,因其本质是普通对象且由 object 构造,需继承 tostring 等基础方法,并保证 instanceof object 为 true,同时避免原型链循环或断裂。

Function.prototype.__proto__ 指向 Object.prototype,这是 JavaScript 原型链中一个关键但常被误解的连接点。它不是偶然设计,而是由对象创建机制和类型本质决定的。
Function.prototype 本身是个普通对象
虽然 Function.prototype 是函数的“原型模板”,但它在运行时就是一个普通对象(typeof Function.prototype === 'function' 是特例,因其内部实现了 [[Call]],但其数据结构仍是对象)。V8 引擎在初始化时就用 Object 构造器创建了它:
- Function.prototype 的构造函数是 Object,所以它的 __proto__ 必然指向 Object.prototype
- 验证:Function.prototype.__proto__ === Object.prototype // true
- 它没有 prototype 属性(Function.prototype.prototype === undefined),说明它不是用来当构造函数的
Object.prototype 是所有对象的终极原型终点
JavaScript 中一切皆对象,包括函数、数组、日期等——它们最终都通过原型链归于 Object.prototype:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- Object.prototype.__proto__ === null,链在此终止
- Function.prototype 作为对象,也必须遵循这条规则;否则就破坏了“所有对象都有原型链”的一致性
- 若 Function.prototype.__proto__ 不是 Object.prototype,那它上面的方法(如 toString、hasOwnProperty)就无法被函数实例继承
为什么不是指向 Function.prototype 自身或别的地方?
这个链接不能循环,也不能跳过基础对象层:
- Function.prototype.__proto__ !== Function.prototype(否则形成无限递归链)
- 它也不能指向 Array.prototype 或 Date.prototype——那些只是特定类型的中间原型,不具备通用性
- 只有 Object.prototype 提供了最基础的对象行为,且被所有内置构造器(Array、Date、RegExp 等)共同依赖
实际影响:方法继承与 instanceof 行为
正因为这条链接存在,函数才能正常使用来自 Object.prototype 的方法:
- console.log((function(){}).toString()) // "[object Function]" —— 来自 Object.prototype.toString
- function F(){}; console.log(F instanceof Object) // true —— 因为 F.__proto__ → Function.prototype → Object.prototype
- 所有函数调用 call/apply/bind,都依赖 Function.prototype 上的方法;而这些方法又能访问 Object.prototype 的能力(比如 this 参数的类型判断)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










