reflect 的静态方法是以标准化方式执行 javascript 底层操作,对应对象内部行为(如[[get]]、[[set]]),返回布尔值或结果值而非抛异常,专为 proxy 默认行为及统一语义设计。

Reflect 的静态方法不是“调用目标对象”,而是**以标准化方式执行 JavaScript 的底层操作**,每个方法对应一个对象内部行为(如读取属性、设置属性、调用函数等),并返回明确的布尔值或结果值,失败时不抛异常而是返回 false 或 undefined。
Reflect 方法本质是操作语义的封装
它不“调用对象”,而是**触发 JavaScript 引擎对目标对象执行特定内部操作**,比如:
-
Reflect.get(target, key, receiver) 触发 [[Get]] 内部方法,查找属性值;若属性有 getter,则将
receiver绑定为 this;target 必须是对象,否则直接报错 - Reflect.set(target, key, value, receiver) 触发 [[Set]] 内部方法,赋值并返回 true/false(是否成功);同样要求 target 是对象
-
Reflect.has(target, key) 对应
key in target,但更可靠——不会触发 getter,也不受原型链上不可枚举属性干扰 -
Reflect.construct(target, args, newTarget?) 等价于
new target(...args),但可指定 new.target(用于继承场景)
与 Proxy 搭配时体现“默认行为”定位
Reflect 方法设计初衷之一,是为 Proxy 提供可复用的默认实现:
- Proxy 的 handler 中,例如
get(target, prop)若未定义逻辑,就无法访问属性;而写成return Reflect.get(target, prop),就精准复现原始读取行为 - 这种组合让开发者既能拦截(如日志、权限校验),又能安全回退到原生语义,避免手动重写易出错的底层逻辑
统一错误处理与返回约定
相比传统操作符或 Object 方法,Reflect 更一致:
- 所有方法都**返回值而非抛异常**:如
Reflect.deleteProperty(obj, 'x')成功返回 true,属性不存在或不可配置也返回 false;而delete obj.x在严格模式下对不可配置属性会 throw TypeError - 参数校验更早更明确:例如
Reflect.get(42, 'toString')直接 TypeError;42.toString()却能工作(因装箱)——Reflect 强制要求 target 是对象,暴露语义边界 - 方法签名与 Proxy handler 完全对齐,便于代理逻辑迁移和复用
不是反射调用,而是语义委托
注意:Reflect 不是 Java 那种“通过 Class 查找 Method 再 invoke”的反射模型。它没有运行时类型发现、成员遍历或动态绑定过程。它的每个方法都是直接委托给引擎执行对应内部操作,属于**语言层的标准化操作入口**,而非元编程层面的“反向查表+调用”。










