Reflect可以用于获取目标对象的行为,它与 Object 类似,但是更易读,为操作对象提供了一种更优雅的方式。它的方法与 Proxy 是对应的。
1. 代替 Object 的某些方法
const obj = {};
Reflect.defineProperty(obj, 'name', {
value: 'lisi',
writable: false,
configurable: false,
})
2. 修改某些 Object 方法返回的结果
// 会抛出错误
try {
Object.defineProperty(target, key, option);
} catch (error) {
console.log(error)
}
// 返回布尔值
if(Reflect.defineProperty(target, key, option)){
// true
}else{
// false
}
3. 命令式变为函数行为
const obj = {
name: 'lisi'
};
// 老写法
console.log('name' in obj); // true
// 新写法
console.log(Reflect.has(obj, 'name')); // true
// 老写法
delete obj.name;
// 新写法
Reflect.deleteProperty(obj, 'name');
4. 配合Proxy
const target = new Set();
const proxy = new Proxy(target, {
get(target, key){
let value = Reflect.get(target.key);
if(value instanceof Function){
return value.bind(target);
}
return value;
},
set(){
Reflect.set(...arguments);
}
})