Reflect.getPrototypeOf() 是获取原型最安全标准的方式,对非对象输入静默返回 null,而 Object.getPrototypeOf() 会抛错;它替代已废弃的 __proto__,配合 === 可安全判断原型链关系。

直接用 Reflect.getPrototypeOf() 是获取原型对象最安全、标准的方式,它专为替代非标准的 obj.__proto__ 和易出错的 Object.getPrototypeOf()(在 null/undefined 上抛错)而设计,能统一处理边界情况。
为什么比 Object.getPrototypeOf() 更安全?
Object.getPrototypeOf() 在传入非对象值(如 null、undefined、原始值 42 或 "hello")时会直接抛出 TypeError;而 Reflect.getPrototypeOf() 对所有非对象输入都**静默返回 null**,符合“失败不中断”的健壮原则。
-
Reflect.getPrototypeOf({})→Object.prototype -
Reflect.getPrototypeOf(null)→null(不报错) -
Reflect.getPrototypeOf(42)→null(不报错) -
Reflect.getPrototypeOf("abc")→null(不报错)
如何正确使用它判断原型链关系?
配合 === 或 Object.is() 可安全比对原型,避免隐式转换或意外继承干扰:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 检查是否直接继承自
Array.prototype:Reflect.getPrototypeOf([1, 2]) === Array.prototype→true - 检查是否处于原生数组原型链中(含多层继承):
Reflect.getPrototypeOf(Reflect.getPrototypeOf([1, 2])) === Object.prototype→true - 通用工具函数示例:
function isPrototypeOf(target, obj) {<br> let proto = Reflect.getPrototypeOf(obj);<br> while (proto !== null) {<br> if (proto === target) return true;<br> proto = Reflect.getPrototypeOf(proto);<br> }<br> return false;<br>}
注意:它不处理“伪对象”或代理陷阱
Reflect.getPrototypeOf() 获取的是对象内部 [[Prototype]] 的当前值,但以下情况需额外留意:
立即学习“Java免费学习笔记(深入)”;
- 对
Proxy对象,它触发getPrototypeOf捕获器,结果取决于代理定义 —— 若捕获器返回非法值(如非对象且非null),会抛错 - 对通过
Object.create(null)创建的对象,返回null,这是正确行为,表示无原型 - 对函数实例,返回其构造函数的
prototype(即func.constructor.prototype),不是Function.prototype本身
替代 __proto__ 的推荐写法
__proto__ 是已废弃的访问器属性,存在性能隐患且非标准(尽管被广泛支持)。应始终用 Reflect.getPrototypeOf() 读取、Object.setPrototypeOf()(谨慎使用)设置:
- ✅ 安全读取:
const parent = Reflect.getPrototypeOf(child); - ❌ 避免:
const parent = child.__proto__; - ⚠️ 设置仅限调试/特殊场景:
Object.setPrototypeOf(child, newParent);(会改变对象内部结构,影响优化)

















