object.getprototypeof返回对象的直接原型引用,非副本;仅返回[[prototype]]指向的对象,不涉及构造函数或更远祖先;与constructor.prototype不一定相等,是instanceof底层机制,比__proto__更标准安全。

Object.getPrototypeOf 返回的是指定对象的**直接原型对象**(即内部 [[Prototype]] 指向的那个对象),它不返回构造函数、不返回原型链上更远的祖先,只返回“紧挨着”的上一级原型。
返回值就是原型对象本身,不是副本
该方法返回的是原始原型对象的**引用**,而非拷贝。对返回值的修改会直接影响原对象的原型行为(除非原型是不可变的,如 Object.prototype)。
- 例如:
const obj = {};,Object.getPrototypeOf(obj)返回Object.prototype - 再如:
const arr = [];,Object.getPrototypeOf(arr)返回Array.prototype - 如果
obj是用Object.create(null)创建的,返回null(无原型)
与 constructor.prototype 不一定等价
很多人误以为 Object.getPrototypeOf(obj) === obj.constructor.prototype 总成立,但其实仅在默认原型链未被篡改时才成立。
- 当手动修改了
obj.constructor.prototype或重写了obj.__proto__,二者就可能不相等 - 箭头函数、类实例、Object.create() 创建的对象,其
constructor可能不可靠或指向意外构造器 -
Object.getPrototypeOf始终反映真实的[[Prototype]]链,比constructor.prototype更可信
可用于判断原型继承关系
它是实现 instanceof 逻辑底层的核心机制之一,适合手动检查某对象是否“继承自”某个原型。
- 例如:
Object.getPrototypeOf(child) === Parent.prototype可判断 child 是否直接受 Parent 构造 - 要检查整个原型链,需循环调用
Object.getPrototypeOf直到返回null - 注意:不能用
===直接比较函数(如Object.getPrototypeOf(obj) === Array错误),应比对象实例
和 __proto__ 的区别
Object.getPrototypeOf(obj) 是标准、安全、只读的获取方式;obj.__proto__ 是非标准(虽被广泛支持)、可读写、已不推荐用于生产代码。
- 修改
__proto__会影响性能且行为不一致(尤其在严格模式下可能报错) -
Object.getPrototypeOf是唯一符合规范的读取方式;设置原型应使用Object.setPrototypeOf()(但也不推荐频繁使用) - 两者返回值相同,但语义和兼容性不同
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











