reflect共13个静态方法,其中12个要求target必须为对象,否则抛typeerror;仅reflect.apply和reflect.construct例外,其target须为函数。

Reflect 静态方法对目标对象有明确且统一的基本要求:绝大多数 Reflect 方法**第一个参数必须是对象(Object 类型)**,否则会直接抛出 TypeError。
哪些方法严格要求 target 是对象?
以下 12 个方法在调用时,若 target 不是对象(如 null、undefined、原始值 string/number/boolean 等),都会立即报错:
Reflect.get(target, key, receiver)Reflect.set(target, key, value, receiver)Reflect.has(target, key)Reflect.deleteProperty(target, key)Reflect.getOwnPropertyDescriptor(target, key)Reflect.defineProperty(target, key, descriptor)Reflect.getPrototypeOf(target)Reflect.setPrototypeOf(target, prototype)Reflect.isExtensible(target)Reflect.preventExtensions(target)Reflect.ownKeys(target)-
Reflect.getOwnProperties(target)(注意:该方法未被标准化,实际不存在;标准中为getOwnPropertyDescriptor和ownKeys)
例如:Reflect.get(42, 'toString') 或 Reflect.set('hello', '0', 'H') 均会触发 TypeError。
唯一例外:Reflect.apply 和 Reflect.construct
这两个方法的 target 参数不要求必须是对象,但必须是**可调用的函数(function)**:
-
Reflect.apply(target, thisArg, args):target 必须是函数,否则报TypeError: Function expected -
Reflect.construct(target, args, newTarget?):target 必须是构造函数(即具有[[Construct]]内部方法),普通函数或非函数值均不合法
它们不接受原始值作为 target,但接受函数——而函数本身也是对象(typeof func === 'function' 且 func instanceof Object 成立),所以仍符合“操作对象”的设计哲学。
receiver 参数的特殊性
在 get 和 set 方法中,第三个参数 receiver 用于绑定 getter/setter 中的 this。它可以不是对象(如 null 或 undefined),此时会自动转为 undefined,并在 getter/setter 执行时作为 this 值(严格模式下为 undefined,非严格模式下提升为全局对象)。但 receiver 本身不会导致 TypeError。
为什么这样设计?
Reflect 的定位是“对象操作的函数化接口”,所有方法都对应 JS 引擎内部对对象的底层操作(如 [[Get]]、[[Set]]、[[HasProperty]] 等)。这些内部操作规范本身只定义在对象上,原始值没有属性空间和内部插槽,因此强制类型检查是语义一致性的必要保障。这也让错误更早暴露,避免隐式装箱带来的歧义和性能损耗。











