Reflect 是 ES6 引入的不可构造的内置静态对象,提供与 Proxy trap 一一对应的函数式方法(如 get/set/has/construct),用于统一、可控地操作对象底层行为,并支持元编程和默认行为转发。

Reflect 是 ES6 引入的内置对象,它不是构造函数,不能用 new 调用,而是提供了一组静态方法,用于以更规范、更统一的方式操作 JavaScript 对象的底层行为(如属性读取、设置、删除、构造等)。它的设计初衷是把原本分散在 Object、Object.defineProperty、delete、in、new 等操作中的能力集中起来,并与 Proxy 的 trap 方法一一对应,便于元编程和拦截逻辑复用。
Reflect 方法与 Proxy trap 严格对齐
每个 Reflect 方法都对应一个 Proxy handler 中的同名 trap(如 Reflect.get ↔ handler.get,Reflect.set ↔ handler.set),参数顺序也完全一致。这使得你在 Proxy 中转发操作时可直接调用 Reflect 方法,避免重复实现或遗漏 this 绑定问题。
-
推荐写法:在 Proxy handler 中优先用 Reflect.xxx 转发,比如
get(target, prop, receiver) { return Reflect.get(target, prop, receiver); } - 优势:Reflect.get 自动处理原型链查找和 getter 调用;Reflect.set 正确绑定 setter 的 this;Reflect.construct 保证 new 行为符合规范
- 注意:Reflect.apply 和 Reflect.construct 不支持箭头函数作为 target,因为它们需要 [[Construct]] 或 [[Call]] 内部方法
统一替代传统操作符和 API
Reflect 提供了函数式接口,能替代部分语言操作符(如 in、delete)和 Object 静态方法,使代码更一致、更易测试和拦截。
-
替代
prop in obj:用Reflect.has(obj, 'prop')—— 返回布尔值,不触发原型链上的 hasOwnProperty -
替代
delete obj.prop:用Reflect.deleteProperty(obj, 'prop')—— 返回布尔值,表示是否成功删除(严格模式下更可靠) -
替代
obj[prop] = value:用Reflect.set(obj, prop, value, receiver)—— 支持 receiver 参数,控制 setter 中的 this -
替代
Object.getOwnPropertyDescriptor:用Reflect.getOwnPropertyDescriptor(target, prop)—— 行为一致,但返回 undefined 而非 null(更符合语义)
配合 Proxy 实现通用拦截逻辑
Reflect 是 Proxy 的“默认行为”提供者。当你想在拦截中保留原语义,只需一行 Reflect 调用,无需手动模拟。
立即学习“Java免费学习笔记(深入)”;
- 例如限制只读属性:
set(target, prop, value) { if (prop === 'id') return false; return Reflect.set(target, prop, value); } - 例如记录所有属性访问:
get(target, prop, receiver) { console.log('get', prop); return Reflect.get(target, prop, receiver); } - Reflect.construct(target, args, newTarget) 可完整代理 new 操作,包括指定构造函数和 new.target
注意边界与兼容性细节
Reflect 方法本身不改变对象状态,只是封装底层抽象操作,但调用结果依赖目标对象是否可变、是否定义了对应 trap 或内部方法。
-
不可扩展对象:
Reflect.preventExtensions()返回布尔值,成功返回 true;后续再调用会返回 false -
冻结对象:
Reflect.set()在冻结对象上会静默失败(非严格模式)或抛错(严格模式),Reflect 返回 false - Symbol 属性:所有 Reflect 方法均支持 Symbol 作为 key,无需额外转换
- 浏览器兼容性:现代浏览器和 Node.js ≥ 6 全面支持;IE 完全不支持,需 polyfill(如 core-js)


















