Object.getPrototypeOf() 是获取对象内部 [[Prototype]] 的标准安全方法,返回其原型对象或 null;不支持原始值和 null/undefined,区别于非标准的 __proto__,语义明确且兼容 IE9+。

Object.getPrototypeOf() 是获取对象隐式原型(即内部 [[Prototype]])的标准、安全方式,比直接访问 __proto__ 更推荐。它返回对象的原型对象,若无则返回 null。
基本用法:获取任意对象的原型
传入目标对象即可,返回其内部原型:
- 普通对象:`Object.getPrototypeOf({})` → `Object.prototype`
- 数组:`Object.getPrototypeOf([1, 2])` → `Array.prototype`
- 函数:`Object.getPrototypeOf(function(){})` → `Function.prototype`
- null 或 undefined:会抛出 TypeError,需先校验
与 __proto__ 的关键区别
__proto__ 是非标准但广泛支持的访问器属性,而 Object.getPrototypeOf() 是 ECMAScript 标准方法,语义明确、行为稳定:
- 不可枚举、不可写:无法被 for...in 遍历,也不能意外覆盖
-
严格模式下更安全:
__proto__在某些环境(如 ES5 严格模式)中可能被禁用或只读 -
适用于所有对象类型,包括用
Object.create(null)创建的无原型对象(返回null)
实用判断场景:检查原型链关系
配合 === 可精准判断是否为某构造函数的实例(比 instanceof 更底层):
- `Object.getPrototypeOf(obj) === Array.prototype` → 确认 obj 直接继承自 Array.prototype
- `Object.getPrototypeOf(Object.getPrototypeOf(obj)) === Object.prototype` → 检查两层原型链
- 常用于库中做类型识别,避免依赖 constructor 属性(易被篡改)
注意事项和常见陷阱
使用时需注意边界情况和兼容性:
- 不能用于原始值:`Object.getPrototypeOf(42)` 抛出 TypeError;需先包装 `Object.getPrototypeOf(new Number(42))`
- 不适用于非对象参数:字符串字面量、布尔值等需转为对象再操作
- IE9+ 支持,旧版 IE 不支持,如需兼容可加简单 polyfill(但通常现代项目无需)
- 不要混淆
Object.getPrototypeOf()和Object.prototype.isPrototypeOf()—— 后者是检查某对象是否在另一对象的原型链上

















