JavaScript中“万物皆对象”实指所有引用类型及部分基本类型包装对象均通过内部[[Prototype]]槽统一属性查找与继承;基本类型本身非对象,null无[[Prototype]],Object.prototype是原型链终点。

“万物皆对象”不是修辞,是 JavaScript 运行时的真实结构——但真正支撑它的,不是每个值都能直接当对象用,而是所有引用类型(以及部分基本类型的包装对象)都拥有一个隐式原型 [[Prototype]],它在语言层面统一了属性查找与继承行为。
隐式原型不是 __proto__,而是 [[Prototype]] 内部槽
开发者常把 __proto__ 当作原型本身,其实它是 [[Prototype]] 的非标准、已不推荐的外部访问接口。ES 规范定义的是内部属性 [[Prototype]],它不可枚举、不可配置,只能通过以下方式安全读取或设置:
-
Object.getPrototypeOf(obj)—— 推荐,标准且可靠 -
Object.setPrototypeOf(obj, proto)—— 谨慎使用,性能敏感 -
Object.create(proto)—— 创建时指定[[Prototype]]的首选方式
例如:const arr = []; 中的 arr 是 Array 实例,其 [[Prototype]] 指向 Array.prototype,而 Array.prototype 的 [[Prototype]] 又指向 Object.prototype,最终链向 null。
函数对象是原型系统的枢纽节点
只有函数才有 prototype 属性(显式原型),这个属性仅在函数被 new 调用时才参与实例的 [[Prototype]] 初始化。关键逻辑是:
立即学习“Java免费学习笔记(深入)”;
- 执行
new Fn()时,引擎自动将新对象的[[Prototype]]设为Fn.prototype -
Fn.prototype默认是一个普通对象,其constructor指回Fn -
Function本身也是函数,所以Function.prototype是所有函数的隐式原型源头之一
这解释了为何 typeof Function === 'function' 且 Function instanceof Object === true:因为 Function 是函数对象,它的 [[Prototype]] 是 Function.prototype,而 Function.prototype 的 [[Prototype]] 是 Object.prototype。
“万物皆对象”的边界与例外
严格来说,并非所有 JS 值都是对象:
- 基本类型(
null,undefined,boolean,number,string,symbol,bigint)本身不是对象,但访问其属性时会临时包装成对应包装对象(如'abc'.length→ 临时String对象) -
null和undefined没有[[Prototype]],调用Object.getPrototypeOf(null)会抛错 -
Object.prototype是唯一一个[[Prototype]]为null的对象,它是整个原型链的终点
所以,“万物皆对象”的实质是:所有可被构造、可被继承、可挂载方法的实体,都通过 [[Prototype]] 链接进同一套查找机制;而基本类型靠包装桥接,null 是链的断点而非漏洞。
验证原型链的三步法
面对任意对象,快速厘清其隐式原型路径:
- 查自身:用
Object.getOwnPropertyNames(obj)看自有属性 - 查一层:用
Object.getPrototypeOf(obj)得到直接原型 - 查到底:递归调用
getPrototypeOf,直到返回null
例如对 new Date() 执行该流程,你会看到:Date 实例 → Date.prototype → Object.prototype → null。每一步都对应规范中明确定义的 [[Prototype]] 关系,没有魔法,只有可追溯的链接。


















