Reflect 是 JavaScript 正式引入的与 Proxy 配套的底层操作集合,提供统一、可拦截、返回布尔值的标准接口;其方法一一对应 Proxy trap,支持 receiver 控制、优雅失败、完整键枚举及纯语义访问。

Reflect 不是语法糖,它是 JavaScript 正式引入的、与 Proxy 配套的底层操作集合——所有原本散落在 Object 上或隐式发生的对象操作,现在有了统一、可拦截、返回布尔结果的标准入口。
Reflect 为什么不能用 Object 替代
Object 上很多方法(如 Object.defineProperty)出错直接抛异常,而 Reflect.defineProperty 返回 false;Object.keys 不处理不可枚举属性或 Symbol 键,Reflect.ownKeys 则明确返回全部自有键(包括 Symbol);更关键的是,Reflect 的每个方法都与 Proxy trap 一一对应,比如 get / set / has,方便在 handler 中直接转发。
-
Object.defineProperty(obj, 'x', { value: 1 })失败时抛TypeError,无法优雅降级 -
Reflect.defineProperty(obj, 'x', { value: 1 })失败时返回false,适合条件判断 -
Object.getOwnPropertyNames(obj)忽略 Symbol 属性;Reflect.ownKeys(obj)同时包含字符串键和 Symbol 键 -
Reflect.get(obj, 'x')等价于obj.x,但可传入 receiver 控制this绑定,且能被 Proxy 拦截
哪些 Reflect 方法真正改变了开发习惯
最常被低估的是 Reflect.construct 和 Reflect.apply:它们让动态调用脱离 new Foo() 和 fn.call() 的硬编码形式,同时保持语义清晰和可代理性。
-
Reflect.construct(Target, args, NewTarget?)是new Target(...args)的函数式等价,支持自定义构造器(NewTarget),比Function.prototype.bind+apply更安全 -
Reflect.apply(func, thisArg, args)替代func.apply(thisArg, args),不依赖func是否有apply方法(比如箭头函数没有),且可被 Proxy 拦截 -
Reflect.set(obj, key, value, receiver)显式控制receiver,避免原型链上 setter 被意外绕过(obj[key] = value总以obj为 receiver)
实际写 Proxy 时,为什么必须搭配 Reflect
不使用 Reflect 的 Proxy handler 很容易漏掉 receiver 或破坏原型链行为。例如手动实现 get 时若只写 target[key],就丢失了 getter 中的 this 绑定;而 Reflect.get(target, key, receiver) 自动透传 receiver,保证语义一致。
每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的、与操作系统无关的SQL数据库--SQLite,本文介绍的就是如何为你的Android应用程序创建和操作SQLite数据库。 数据库支持每个应用程序无论大小的生命线,除非你的应用程序只处理简单的数据,那么就需要一个数据库系统存储你的结构化数据,Android使用SQLite数据库,它是一个开源的、支持多操作系统的SQL数据库,在许多领域广泛使用,如Mozilla FireFox就是使用SQLite来存储配置数据的,iPhon
立即学习“Java免费学习笔记(深入)”;
const handler = {
get(target, key, receiver) {
console.log('Getting:', key);
// ✅ 正确:保留 receiver,getter 中的 this 指向 receiver 而非 target
return Reflect.get(target, key, receiver);
// ❌ 错误:target[key] 会丢失 receiver,导致 getter 内部 this 指向 target
},
set(target, key, value, receiver) {
console.log('Setting:', key, value);
// ✅ 正确:receiver 影响 setter 执行上下文
return Reflect.set(target, key, value, receiver);
}
};
容易忽略的边界点
Reflect 方法全部是不可枚举、不可配置、不可写的,不能被重写或遍历;它不提供新能力,只是把引擎内部操作暴露为函数接口——所以你不会在生产代码里“为了用而用”,但一旦涉及元编程、框架封装或细粒度控制,绕不开它。
-
Reflect.isExtensible和Object.isExtensible行为一致,但前者是标准定义的唯一权威入口(后者只是反射) -
Reflect.preventExtensions成功时返回true,失败时返回false;Object.preventExtensions总返回目标对象,失败仍返回对象(需额外isExtensible判断) - 所有
Reflect方法都不修改原型链,也不触发defineProperty类型的副作用——它只是访问/设置的“纯”通道










