Object.getPrototypeOf() 返回指定对象的内部[[Prototype]]值:对普通对象返回其原型(如Object.prototype),对Object.create(null)返回null,对原始值包装后返回对应构造函数prototype;它标准、只读,优于可写且非标准的__proto__。

Object.getPrototypeOf() 是 JavaScript 中用于获取指定对象的原型(即其内部 [[Prototype]] 指针所指向的对象)的标准方法,由 ECMAScript 规范定义,行为稳定且跨环境一致。
标准行为:返回对象的 [[Prototype]]
该方法严格返回参数对象的内部属性 [[Prototype]] 的值:
- 若对象有原型(如普通对象、数组、函数等),返回其原型对象(例如
Object.getPrototypeOf({}) === Object.prototype); - 若对象原型为
null(如通过Object.create(null)创建的对象),则返回null; - 若传入非对象值(如字符串、数字、
undefined、null),会先进行强制对象包装(ToObject),再取其原型;但null和undefined会直接抛出TypeError; - 对原始值(如
"abc"、42、true),会临时包装成对应包装对象(String、Number、Boolean),因此返回其构造函数的prototype(如Object.getPrototypeOf("abc") === String.prototype)。
与 __proto__ 的区别
Object.getPrototypeOf(obj) 是标准、只读、推荐使用的 API;而 obj.__proto__ 是早期非标准遗留属性,虽被广泛支持并已写入规范附录(作为历史兼容特性),但不推荐在新代码中使用:
-
__proto__可读可写(存在副作用风险),getPrototypeOf仅读取; - 修改
__proto__可能导致性能下降或不可预测行为; - 在严格模式下给
__proto__赋值不会报错但无效(静默失败),而Object.setPrototypeOf()是对应的标准化写入方法。
常见使用场景和注意事项
典型用途包括类型判断、原型链遍历、框架/库中的继承检测等:
立即学习“Java免费学习笔记(深入)”;
- 判断是否为原生数组:
Object.getPrototypeOf(arr) === Array.prototype(比instanceof更底层、不受跨 iframe 限制); - 安全地向上遍历原型链:
let p = obj; while (p = Object.getPrototypeOf(p)) { /* ... */ },注意终止条件是null; - 避免直接访问
constructor.prototype,因为constructor可被篡改,而getPrototypeOf始终反映真实原型链接; - 不能用于函数的
prototype属性本身——Object.getPrototypeOf(Fn.prototype)返回的是Object.prototype(因为所有 prototype 对象都是普通对象),而非Fn的原型。
兼容性与替代方案
该方法自 ES5 起标准化,现代浏览器及 Node.js 全面支持。若需兼容极老环境(如 IE8 及更早),可考虑降级方案:
- 对普通对象尝试访问
obj.__proto__(不推荐); - 使用
obj.constructor.prototype(不可靠,易被覆盖); - 更稳妥的做法是结合
Object.prototype.toString.call()进行类型识别,而非依赖原型链。
不复杂但容易忽略:它返回的是「当前对象直接关联的原型」,不是整个原型链,也不修改对象本身。


















