Reflect 是 ES6 提供的标准化底层操作接口,与 Proxy 配套使用;其方法如 Reflect.get()、Reflect.set()、Reflect.construct() 等统一返回布尔值或值,支持 receiver 绑定,错误可控,专为元编程和 Proxy handler 设计。

Reflect 不是“反射机制”的教学工具,而是 ES6 提供的一套标准化的、与 Proxy 配套的底层操作接口——它不让你“动态获取类型信息”,而是让你以函数形式调用原本隐式发生的语言内部操作。
Reflect.get() 为什么比 obj.prop 更可靠?
直接访问属性可能触发 getter、抛出异常(如冻结对象上写只读属性),而 Reflect.get() 统一返回 undefined 或实际值,并把错误控制权交给你:
- 支持传入 receiver(即 this 绑定),对继承链上的 getter 尤其关键
- 在 Proxy handler 中必须用
Reflect.get(target, key, receiver)而非target[key],否则会丢失 receiver 上下文 - 不会因属性不存在而报错,适合做安全取值(配合
in或Reflect.has()判断)
Reflect.set() 和赋值运算符的区别在哪?
obj.x = v 是语句,不可拦截也不返回布尔值;Reflect.set() 是函数,返回 true / false 表示是否成功设置:
- 对不可写属性、不可扩展对象等场景,
Reflect.set()返回false,而=在严格模式下直接 throw TypeError - 同样支持 receiver 参数,确保 setter 正确绑定 this
- 在 Proxy 的
sethandler 中,推荐用Reflect.set(...arguments)透传,避免手动实现逻辑遗漏
Reflect.construct() 替代 new 的真实用途
Reflect.construct() 不是为了炫技,而是解决两个硬需求:
立即学习“Java免费学习笔记(深入)”;
- 动态构造实例:参数个数不确定时,不用拼
new Ctor(a, b, c),可直接Reflect.construct(Ctor, argsArray) - 指定 [[Prototype]]:支持第三个参数
newTarget,能精确控制实例的__proto__,这在自定义类继承或 polyfill 原生类时不可替代 - 它比
Function.prototype.apply+Object.create更语义清晰、行为标准,且兼容 new.target
Reflect.defineProperty() 等操作为何返回布尔值?
所有 Reflect 方法都遵循“成功返回 true,失败返回 false”原则,不像 Object API 抛异常:
-
Reflect.defineProperty(obj, 'x', { value: 1 })失败时不 throw,方便批量操作中做降级处理 - 和
Object.defineProperty()行为一致,但前者更适配 Proxy handler(比如你不想让 defineProperty 失败中断整个 proxy 流程) - 注意:该布尔值仅表示“是否完成定义”,不保证后续读写行为符合预期(比如 writable: false 后仍可能被 delete)
真正容易被忽略的是:Reflect 方法本身不提供元编程能力,它只是把 JS 引擎内部操作暴露成函数——它的价值全在和 Proxy 搭配时的可控性。单独用 Reflect.get() 取值,多数时候不如直接点号简洁;但一旦进入代理逻辑、需要精确控制 this、接收方、错误策略,它就不是“可选”,而是“必须”。











