Object.getPrototypeOf揭示对象原型链的源头,所有非原始值均有可追溯原型,原始值通过包装对象参与原型链,其返回值为紧邻上一级原型,是不可伪造的权威溯源方式。

Object.getPrototypeOf 是理解“万物皆对象”最直接的入口——它不展示对象“是什么”,而是揭示对象“从哪里来”。真正透彻的理解,不靠背诵口号,而在于看清每个值背后那条隐而不显却真实存在的原型链。
所有非原始值,都有可追溯的原型
JavaScript 中只有 7 种原始类型(number、string、boolean、null、undefined、symbol、bigint),其余一切——包括数组、函数、正则、日期、Promise、甚至 new Number(42) 包装对象——都拥有原型,都能被 Object.getPrototypeOf() 检索:
- 函数也是对象:Object.getPrototypeOf(function(){}) === Function.prototype
- 数组也是对象:Object.getPrototypeOf([1,2]) === Array.prototype
- 正则也是对象:Object.getPrototypeOf(/abc/) === RegExp.prototype
- 自定义构造器实例:const obj = new Date(); Object.getPrototypeOf(obj) === Date.prototype
就连 Object.prototype 本身也有原型——但它的原型是 null。这正是“万物皆对象,而万物终归于空”的具象表达。
原始值不直接有原型,但包装对象有
你不能对字面量字符串调用 Object.getPrototypeOf("hello")——会报错,因为原始值没有原型。但当你对它做隐式或显式包装时,它立刻“升格”为对象:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- "hello".__proto__ === String.prototype(隐式包装)
- Object.getPrototypeOf(new String("hello")) === String.prototype(显式包装)
- 同理,123..__proto__ === Number.prototype;true.__proto__ === Boolean.prototype
这种自动包装机制,让原始值在需要时“穿上对象外衣”,参与原型链查找——比如调用 "abc".toUpperCase(),本质是通过 String.prototype.toUpperCase 实现的。这不是语法糖,而是语言设计者刻意模糊原始与对象边界的哲学选择。
Object.getPrototypeOf 的返回值,就是原型链的“下一站”
它不返回整个链,只返回紧邻的上一级原型。但正因如此,它成了遍历链路的可靠探针:
- Object.getPrototypeOf({}) === Object.prototype
- Object.getPrototypeOf(Object.prototype) === null
- Object.getPrototypeOf([]) === Array.prototype
- Object.getPrototypeOf(Array.prototype) === Object.prototype
你可以顺着它一层层往上走,直到抵达 null —— 这条路径就是该对象的完整继承路线。它不依赖 __proto__(已被标准化但不推荐直接使用),也不依赖 constructor(易被篡改),是唯一不可伪造、不可绕过的权威溯源方式。
真正的“万物皆对象”,体现在行为一致性上
不是说“所有东西都是 Object 的实例”,而是说:所有非原始值,都遵循同一套访问规则——属性查找走原型链、方法调用依赖 this 绑定、继承靠原型委派。Object.getPrototypeOf 让你亲眼验证这一点:
- var f = function(){}; var a = []; var r = /./; Object.getPrototypeOf(f) !== Object.getPrototypeOf(a) 但它们最终都连向 Object.prototype,共享 hasOwnProperty、toString 等基础能力
- 即便 Symbol、BigInt 等新原始类型,其包装对象(new Symbol()、Object(BigInt(1)))也严格进入原型体系
差异存在于中间层(Array.prototype、Function.prototype 各司其职),统一性扎根于终点(Object.prototype → null)。这种“分形结构”——多样中见统一,个体中见共源——才是 JavaScript 原型哲学最深的底色。

















