reflect.getprototypeof() 是获取对象原型最安全标准的方式,它直接调用内部[[getprototypeof]]操作,不触发getter、不受__proto__篡改影响,且仅接受对象类型,传入原始值会抛typeerror。

用 Reflect.getPrototypeOf() 获取对象原型是目前最安全、标准的方式,它严格遵循 ES6+ 规范,不会触发 getter,也不受对象自身 __proto__ 属性或 Object.prototype.__proto__ 被篡改的影响。
为什么比 obj.__proto__ 更安全
obj.__proto__ 是非标准的遗留属性(尽管被广泛支持),且在严格模式下对不可扩展对象可能抛错;更关键的是,它会尝试读取对象自身的 __proto__ 属性(如果存在),而该属性可能是伪造的或带有副作用的 getter。Reflect.getPrototypeOf(obj) 则直接调用内部 [[GetPrototypeOf]] 操作,绕过所有用户定义的属性和访问器,只返回引擎实际用于查找的原型对象。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
基本用法与注意事项
- 只能传入对象类型,传入原始值(如
42、"str"、null、undefined)会抛TypeError - 对普通对象、数组、函数、内置类实例(如
new Date())都适用 - 返回
null表示已到达原型链末端(即对象无原型,如Object.create(null)创建的对象) - 不支持代理(Proxy)的 trap 拦截 —— 它始终返回目标对象的真实原型,不受
getPrototypeOfhandler 影响
典型安全获取场景
以下写法可避免常见陷阱:
-
检查是否继承自某个构造函数原型:
Reflect.getPrototypeOf(obj) === MyConstructor.prototype -
遍历原型链(需手动循环):
let proto = obj;<br>while ((proto = Reflect.getPrototypeOf(proto)) !== null) { console.log(proto); } -
兼容性兜底(仅当需支持极老环境时):
const getProto = Object.getPrototypeOf || Reflect.getPrototypeOf;(注意:两者行为一致,但Object.getPrototypeOf同样安全,只是Reflect版本语义更明确)
不要混淆:不是用来“设置”原型的
Reflect.getPrototypeOf() 是只读操作。若需设置原型,请用 Object.setPrototypeOf() 或更推荐的 Object.create(prototype, descriptors) 创建新对象。直接修改 __proto__ 已被强烈不建议,且性能差、不可靠。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










