Reflect 是什么,有什么作用?
面试速答(30 秒版 TL;DR)
Reflect是一个内置对象,提供一组**“反射”API**,把一些对象操作从“语法/运算符”变成“函数调用”。- 它的很多方法与
Proxy的 trap 一一对应,常用于:- 在 Proxy 里把默认行为转发出去(
return Reflect.get(...))。 - 更一致的返回值(例如
Reflect.set返回 boolean,便于判断成功与否)。
- 在 Proxy 里把默认行为转发出去(
常用 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更贴近语言内部的默认行为。
- 在 getter/setter、继承、receiver 等语义下,
Reflect.ownKeys的价值:- 一次性拿到字符串 key + Symbol key(写框架/工具时常用)。
易错点/坑
- 只会背“Reflect 是反射”但说不清用途:重点讲 Proxy 转发与一致返回值。
- 把 Reflect 当成“元编程万能钥匙”:它只是把对象操作提供成标准函数接口。
速记要点(可背诵)
- Reflect:对象操作的函数化 API,常和 Proxy 配合,用来转发默认行为。