JavaScript中几乎所有对象最终都继承自Object.prototype,因其[[Prototype]]为null而成为原型链终点;函数对象经Function.prototype后仍指向它;仅Object.create(null)例外。

是的,JavaScript 中几乎所有对象最终都继承自 Object.prototype。这不是约定,而是语言底层机制决定的——原型链查找必须有终点,而这个终点被硬编码为 Object.prototype,它的内部 [[Prototype]] 值为 null。
为什么终点一定是 Object.prototype
- 每个对象都有一个内部属性
[[Prototype]],它指向另一个对象(或null)。 - 当访问对象的属性或方法(比如
obj.toString())时,JS 引擎按顺序查找:
→ 先查对象自身
→ 再查Object.getPrototypeOf(obj)返回的对象
→ 接着查该对象的[[Prototype]],如此逐级向上
→ 直到遇到[[Prototype]] === null,查找终止。 -
Object.prototype是唯一一个[[Prototype]]为null的内置原型对象,因此它是所有普通对象原型链的逻辑终点和事实根节点。 - 这也是
toString、hasOwnProperty、valueOf等通用方法能被任意对象调用的原因——它们就定义在Object.prototype上。
函数对象是个特例,但依然绕不开 Object.prototype
- 函数也是对象,所以函数实例(如
function fn(){})的[[Prototype]]指向Function.prototype。 - 而
Function.prototype自身的[[Prototype]]指向Object.prototype。 - 所以函数对象的完整原型链是:
fn → Function.prototype → Object.prototype → null
这意味着即使函数对象“先经过” Function.prototype,最终仍会抵达 Object.prototype。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
构造方式不同,终点一致
- 字面量创建:
{}、[]、/regex/、new Date()等,底层都会把[[Prototype]]设为对应构造器的prototype,而这些构造器的prototype最终都指向Object.prototype。 - 手动创建:
Object.create(null)是唯一常见例外,它跳过Object.prototype,直接让[[Prototype]]为null,因此不继承任何方法(包括toString),属于“纯净空对象”。
如何验证
console.log(Object.getPrototypeOf({})); // Object.prototype
console.log(Object.getPrototypeOf([])); // Array.prototype
console.log(Object.getPrototypeOf(Array.prototype)); // Object.prototype
console.log(Object.getPrototypeOf(Object.prototype)); // null
const fn = () => {};
console.log(Object.getPrototypeOf(fn) === Function.prototype); // true
console.log(Object.getPrototypeOf(Function.prototype) === Object.prototype); // true不复杂但容易忽略

















