Object.getPrototypeOf 是标准、安全、可读性强的原型获取方式,应完全替代 proto 或 constructor.prototype;它返回对象的内部[[Prototype]],行为稳定且兼容ES5+,而__proto__是非标准遗留属性,严格模式下受限,constructor.prototype则因可被改写而不可靠。

Object.getPrototypeOf 是标准、安全、可读性强的原型获取方式,应完全替代 __proto__ 或构造函数的 .prototype 错误用法。
为什么不能直接读取 __proto__
__proto__ 是早期非标准属性,虽被主流引擎支持,但已被 ECMAScript 明确标记为“历史性遗留”,不推荐在生产代码中使用。它在严格模式下可能受限,且语义模糊(易与 Function.prototype 混淆),还可能被 Object.freeze 或 Proxy 干扰。
常见误用示例:
-
obj.__proto__—— 不标准,可读性差 -
obj.constructor.prototype—— 极不可靠(constructor可被改写,继承链断裂时返回错误原型)
正确用法:Object.getPrototypeOf(obj)
该方法返回对象的内部 [[Prototype]],符合语言规范,行为稳定,且适用于所有普通对象、数组、日期等内置类型。
基本用法:
-
Object.getPrototypeOf({}) === Object.prototype✅ -
Object.getPrototypeOf([]) === Array.prototype✅ -
Object.getPrototypeOf(new Date()) === Date.prototype✅ - 对 null 或原始值调用会抛出 TypeError,需提前校验类型
配合 Object.setPrototypeOf 实现安全原型操作
若需动态修改原型(如模拟继承或测试场景),应配对使用 Object.getPrototypeOf 和 Object.setPrototypeOf,二者均为标准 API。
例如创建一个继承自 Array 的类实例(不通过 class):
- 先用
Object.create(Array.prototype)创建干净实例 - 再用
Object.getPrototypeOf(instance)验证是否正确指向Array.prototype - 避免直接赋值
instance.__proto__ = ...,防止意外覆盖或不可预测行为
兼容性与实用技巧
该方法自 ES5 起即被广泛支持(IE9+),现代项目无需 polyfill。搭配 Object.is 可做精准原型比对:
Object.is(Object.getPrototypeOf(obj), SomeClass.prototype)- 比
===更健壮(能正确处理NaN等边界情况,不过原型比较一般不会遇到) - 调试时可链式调用:
Object.getPrototypeOf(Object.getPrototypeOf(obj))查看上两级原型
用 Object.getPrototypeOf 替代非标准访问,不是语法糖,而是明确表达「我要读取这个对象的原型」这一意图,让代码更可靠、更易维护。

















