Reflect.getPrototypeOf 和 Reflect.setPrototypeOf 是 ES6 提供的安全操作对象原型的标准方法:前者读取对象内部[[Prototype]](不接受非对象参数),后者设置原型并返回布尔结果(仅对可扩展对象生效,失败不抛错)。

Reflect.getPrototypeOf 和 Reflect.setPrototypeOf 是 ES6 提供的、用于安全读写对象原型的标准化方法,替代了过去直接操作 __proto__ 或使用 Object.getPrototypeOf/Object.setPrototypeOf 的非标准/低效写法。
用 Reflect.getPrototypeOf 读取原型链顶端
它等价于 Object.getPrototypeOf(obj),但作为 Reflect 方法,语义更统一,且在 Proxy 中可被拦截。返回指定对象的内部 [[Prototype]](即 obj.__proto 指向的对象)。
- 如果传入非对象(如 null、数字、字符串),会抛出
TypeError,不会静默转为对象 - 对普通对象、数组、函数都适用:
Reflect.getPrototypeOf([])返回Array.prototype - 对 null 或 undefined 不合法,需提前判断:
obj != null && typeof obj === 'object' && Reflect.getPrototypeOf(obj)
用 Reflect.setPrototypeOf 设置新原型(谨慎使用)
它尝试将对象的内部 [[Prototype]] 设为指定值,成功返回 true,失败(如目标不可扩展、新原型非对象或 null)返回 false —— 这是和 Object.setPrototypeOf 最关键的区别:后者失败直接抛错,而 Reflect 版本更可控。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 仅对**可扩展对象**生效;若对象已通过
Object.preventExtensions()或Object.freeze()锁定,返回false - 第二个参数必须是对象或
null,传入原始值(如42)会返回false,不报错 - 常用于构造时设置原型,避免污染全局:
Reflect.setPrototypeOf(myObj, CustomProto)
配合 Proxy 实现原型访问/修改拦截
Reflect 方法天然支持 Proxy 的 trap(陷阱)。例如定义一个可监控原型变更的代理:
立即学习“Java免费学习笔记(深入)”;
const obj = {};
const handler = {
getPrototypeOf(target) {
console.log('正在读取原型');
return Reflect.getPrototypeOf(target); // 必须用 Reflect 调用,否则可能无限递归
},
setPrototypeOf(target, proto) {
console.log('尝试设置原型为:', proto);
return Reflect.setPrototypeOf(target, proto); // 同样需用 Reflect 转发
}
};
const proxy = new Proxy(obj, handler);
Reflect.getPrototypeOf(proxy); // 输出日志并返回 Object.prototype
Reflect.setPrototypeOf(proxy, null); // 输出日志并返回 true
注意事项与替代建议
直接修改原型会影响性能(V8 等引擎会取消对象的优化),也容易引发继承逻辑混乱。日常开发中优先考虑:
- 用
class和extends声明清晰的继承关系 - 需要动态委托时,用
Object.create(proto)创建新对象,而非改已有对象的原型 - 仅在框架层、polyfill 或特殊元编程场景下才使用
Reflect.setPrototypeOf - 不要用
Reflect.setPrototypeOf替代组合或 mixin;现代写法倾向Object.assign或私有字段 + 方法委托

















