跳到主要内容

Reflect 是什么,有什么作用?

面试速答(30 秒版 TL;DR)

  • Reflect 是一个内置对象,提供一组**“反射”API**,把一些对象操作从“语法/运算符”变成“函数调用”。
  • 它的很多方法与 Proxy 的 trap 一一对应,常用于:
    • 在 Proxy 里把默认行为转发出去(return Reflect.get(...))。
    • 更一致的返回值(例如 Reflect.set 返回 boolean,便于判断成功与否)。

常用 Reflect API(高频)

  • Reflect.get(target, key, receiver)
  • Reflect.set(target, key, value, receiver)
  • Reflect.has(target, key)(对应 key in target
  • Reflect.deleteProperty(target, key)(对应 delete target[key]
  • Reflect.ownKeys(target)(包含字符串 key 与 Symbol key)
  • Reflect.apply(fn, thisArg, args)
  • Reflect.construct(Ctor, args)

最小例子:Proxy + Reflect(最常见的组合)

const obj = {x: 1};

const p = new Proxy(obj, {
get(target, key, receiver) {
if (key === 'x') return 42;
return Reflect.get(target, key, receiver);
},
set(target, key, value, receiver) {
if (key === 'x') return false; // 拒绝修改
return Reflect.set(target, key, value, receiver);
},
});

console.log(p.x); // 42
console.log(Reflect.set(p, 'x', 2)); // false

面试表达要点:Reflect 让“转发默认行为”更标准,避免你手写 target[key] 时遗漏 receiver/原型链语义。


常见追问

  • 为什么不用 target[key]
    • 在 getter/setter、继承、receiver 等语义下,Reflect.get/set 更贴近语言内部的默认行为。
  • Reflect.ownKeys 的价值:
    • 一次性拿到字符串 key + Symbol key(写框架/工具时常用)。

易错点/坑

  • 只会背“Reflect 是反射”但说不清用途:重点讲 Proxy 转发与一致返回值。
  • 把 Reflect 当成“元编程万能钥匙”:它只是把对象操作提供成标准函数接口。

速记要点(可背诵)

  • Reflect:对象操作的函数化 API,常和 Proxy 配合,用来转发默认行为。