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)
Reflect 方法的设计初衷之一,就是让 Proxy 的 trap 能“转发”操作到默认行为,避免重复实现或遗漏细节(比如原型链查找、setter 调用、this 绑定):
Reflect.get(target, prop, receiver) 而非 target[prop],因为它自动处理 receiver(影响 getter 中的 this)Reflect.set() 会正确触发 setter 并返回布尔值表示是否成功,比赋值语句更可控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)Reflect 不是 Object 的替代品。它专注“操作行为”,而 Object 更侧重“构造、检测、工具”。两者的分工清晰:
Object.keys() 获取可枚举字符串键(面向开发者常用)Reflect.ownKeys() 获取所有自有键(含不可枚举、Symbol,面向底层控制)Object.defineProperty() 声明式定义属性(适合初始化)Reflect.defineProperty() 在 Proxy 中安全转发定义逻辑(返回 boolean,便于错误处理)Reflect 的价值不在“炫技”,而在让 JavaScript 的对象模型更内聚、可预测、可代理。它把曾经散落在语法和 API 中的行为收束成一套函数式、可组合、可拦截的接口。
以上就是什么是JavaScript反射_Reflect对象提供了哪些能力的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号