Relect对象

60 阅读1分钟

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);
  }
})