Reflect 是一组静态方法,以函数式方式操作对象底层行为,与 Proxy trap 一一对应,使隐式操作显式化、可拦截、可复用。

JavaScript 的 Reflect 对象不是用来“反射类型”或“获取类信息”的传统意义反射,而是一组静态方法,用于**以函数式方式操作对象底层行为**,与 Proxy 的 trap 方法一一对应,让原本隐式、分散的操作变得显式、可拦截、可复用。
统一对象底层操作的接口
过去很多对象操作是语法级的(比如 obj.prop、delete obj.key、in、new),无法直接被拦截或抽象。Reflect 提供了对应的函数化方法,例如:
-
Reflect.get(obj, key, receiver)—— 替代obj[key] -
Reflect.set(obj, key, value, receiver)—— 替代obj[key] = value -
Reflect.has(obj, key)—— 替代key in obj -
Reflect.deleteProperty(obj, key)—— 替代delete obj[key] -
Reflect.construct(ctor, args, newTarget)—— 替代new ctor(...args) -
Reflect.apply(func, thisArg, args)—— 替代func.apply(thisArg, args)
与 Proxy 深度配合,实现可靠拦截
Reflect 方法的设计初衷之一,就是让 Proxy 的 trap 能“转发”操作到默认行为,避免重复实现或遗漏细节(比如原型链查找、setter 调用、this 绑定):
- 在 Proxy handler 中,推荐用
Reflect.get(target, prop, receiver)而非target[prop],因为它自动处理receiver(影响 getter 中的this) - 类似地,
Reflect.set()会正确触发 setter 并返回布尔值表示是否成功,比赋值语句更可控 - 所有 Reflect 方法都返回明确的成功状态(如 boolean 或 value),失败时不抛异常(除个别如
Reflect.defineProperty仍遵循 Object.defineProperty 的 throw 行为)
提供语法无法直接表达的操作
有些底层能力没有对应语法,只能通过 Reflect 访问:
立即学习“Java免费学习笔记(深入)”;
-
Reflect.getOwnPropertyDescriptor(obj, key)—— 获取自有属性描述符(类似Object.getOwnPropertyDescriptor,但它是 Reflect 的一部分,语义更统一) -
Reflect.getOwnPropertyNames(obj)和Reflect.ownKeys(obj)—— 枚举自有属性键(后者还包含 Symbol) -
Reflect.isExtensible(obj)、Reflect.preventExtensions(obj)—— 检查/禁止扩展 -
Reflect.setPrototypeOf(obj, proto)—— 设置原型(比obj.__proto__ =更规范,且可失败返回 false)
不替代 Object API,而是补充与对齐
Reflect 不是 Object 的替代品。它专注“操作行为”,而 Object 更侧重“构造、检测、工具”。两者的分工清晰:
- 用
Object.keys()获取可枚举字符串键(面向开发者常用) - 用
Reflect.ownKeys()获取所有自有键(含不可枚举、Symbol,面向底层控制) - 用
Object.defineProperty()声明式定义属性(适合初始化) - 用
Reflect.defineProperty()在 Proxy 中安全转发定义逻辑(返回 boolean,便于错误处理)
Reflect 的价值不在“炫技”,而在让 JavaScript 的对象模型更内聚、可预测、可代理。它把曾经散落在语法和 API 中的行为收束成一套函数式、可组合、可拦截的接口。










