object.getprototypeof 是获取对象直接原型的标准方法,返回其内部[[prototype]]值(对象或null),不遍历继承链,不可写且符合ecmascript标准,替代已废弃的__proto__。

Object.getPrototypeOf 是 JavaScript 中用于获取指定对象的原型(即内部 [[Prototype]])的标准方法,其语义明确、行为稳定,是 ES5 引入的标准化替代方案,取代了非标准的 obj.__proto__ 访问方式。
语义定义:返回对象的 [[Prototype]] 值
该方法严格返回目标对象内部属性 [[Prototype]] 的当前值。这个值要么是一个对象,要么是 null(例如 Object.prototype 的原型)。它不涉及继承链遍历,只取“直接原型”:
- 对普通对象,返回其构造函数的
prototype属性所指向的对象; - 对通过
Object.create(null)创建的对象,返回null; - 对原始包装对象(如
new String("x")),返回对应构造函数的原型(String.prototype); - 对
null或undefined等非对象值,会先强制转换为对象(触发装箱),再取其原型 —— 但实际调用时会抛出TypeError,因为规范要求参数必须是 object 类型。
与 __proto__ 的关键区别
Object.getPrototypeOf 是只读查询接口,而 __proto__ 是可读写的非标准访问器属性:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 前者不可被重写或屏蔽,行为由引擎统一保证;
- 后者在部分环境中可被修改(如
obj.__proto__ = newProto),但已被标记为废弃,且在严格模式下可能报错; - 使用
getPrototypeOf能确保代码符合 ECMAScript 标准,具备更好的可移植性和未来兼容性。
典型使用场景
常用于类型判断、原型链检查、类继承调试等安全可靠的元编程操作:
- 判断是否为原生数组:
Object.getPrototypeOf(arr) === Array.prototype; - 检查对象是否直接继承自某个原型:
Object.getPrototypeOf(obj) === MyConstructor.prototype; - 配合
Object.setPrototypeOf实现受控的原型替换(注意:后者性能开销大,应谨慎使用); - 在 polyfill 或工具库中安全地读取原型,避免依赖非标准属性。
注意事项与边界情况
需注意以下几点以避免误用:
- 不能传入原始值(如字符串字面量
"abc"),否则抛出TypeError;若需处理原始值,应先显式包装:Object.getPrototypeOf(new String("abc")); - 对函数对象,返回的是
Function.prototype(而非其prototype属性本身); - 在 Proxy 对象上使用时,会触发
getPrototypeOf捕获器,行为取决于 handler 定义; - 返回结果不一定是可枚举或可配置的,仅反映内部原型链接状态。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










