Object.getPrototypeOf返回对象的[[Prototype]](原型),结果为对象或null,不转换类型;对原始值自动装箱后取原型;需判空避免报错,推荐使用而非__proto__或constructor.prototype。

Object.getPrototypeOf 返回的是对象的内部 [[Prototype]](即原型),它是一个对象或 null,不会自动转换类型,也不进行隐式 coercion。
返回值严格遵循原型链结构
该方法只读取对象内部的 [[Prototype]] 指针,返回其指向的对象。若对象没有原型(如通过 Object.create(null) 创建),则返回 null。它不处理、不包装、不转换结果 —— 返回什么就是什么。
- 普通对象:返回其构造函数的
prototype对象(如{}的原型是Object.prototype) - 数组:返回
Array.prototype - 函数:返回
Function.prototype - null 原型对象:直接返回
null - 原始值(如数字、字符串字面量):会先被装箱为对应包装对象,再取其原型(如
Object.getPrototypeOf(42)→Number.prototype)
不能对返回值做“自动类型转换”假设
返回值不是字符串、数字或布尔值,它是引用类型(对象或 null)。试图把它当作字符串拼接、数值运算或逻辑判断时,JS 会按常规规则进行 运行时转换,但这与 getPrototypeOf 本身无关。
-
'' + Object.getPrototypeOf({})→"[object Object]"(调用toString()) -
Object.getPrototypeOf({}) == Object.prototype→true(严格相等需用===) -
!Object.getPrototypeOf({})→false(对象转布尔为 true) -
Object.getPrototypeOf(Object.create(null)) === null→true
安全使用的关键点
在判断或操作返回值前,应明确其可能为 null 或任意对象,避免意外报错。
立即学习“Java免费学习笔记(深入)”;
- 检查是否为
null:用=== null,不要用== null(会匹配undefined) - 避免直接调用方法:如
Object.getPrototypeOf(obj).hasOwnProperty可能因返回null报错,应先判空 - 想获取原型链上某属性?优先用
Object.prototype.hasOwnProperty.call(proto, key)或proto?.hasOwnProperty?.(key) - 需要原型链遍历?配合
while (proto = Object.getPrototypeOf(proto)),注意终止条件
与 __proto__ 和 constructor.prototype 的区别
Object.getPrototypeOf(obj) 是标准、可靠、不可枚举的获取方式;obj.__proto__ 是非标准但广泛支持的访问器;而 obj.constructor?.prototype 不一定等于其原型(构造函数可被改写,且某些对象如数组的 constructor 不指向 Array)。
- 推荐始终使用
Object.getPrototypeOf获取原型 - 不要依赖
constructor推导原型,尤其在继承或动态修改后 -
__proto__仅用于调试或兼容旧代码,生产环境避免赋值


















