Reflect

157 阅读2分钟

1.Reflect

1.1 简述

  1. 将Object对象的一些明显属于语言内部的方法(比如Object.defineProperty),放到Reflect对象上。

  2. 修改某些Object方法的返回结果,让其变得更合理。比如,Object.defineProperty(obj, name, desc)在无法定义属性时,会抛出一个错误,而Reflect.defineProperty(obj, name, desc)则会返回false。

  3. 让Object操作都变成函数行为。某些Object操作是命令式,比如name in obj和delete obj[name],而Reflect.has(obj, name)和Reflect.deleteProperty(obj, name)让它们变成了函数行为。

  4. Reflect对象的方法与Proxy对象的方法一一对应,只要是Proxy对象的方法,就能在Reflect对象上找到对应的方法。这就让Proxy对象可以方便地调用对应的Reflect方法,完成默认行为。

第3点

let target1 = {
  name: "啊橙",
  age: 25,
}

// console.log('age' in target1)   // true
// console.log(Reflect.has(target1, 'age'))  // true

第4点

let proxy = new Proxy(target1, {
  set: function (target1, name, value, receiver) {
    // 拦截target1对象的属性赋值行为,它采用Reflect.set方法将值赋
    // 值给对象的属性,确保完成原有的行为,然后再部署额外的功能
    var success = Reflect.set(target1, name, value, receiver);
    if (success) {
      console.log("我执行了其他的方法");
    }
    return success;  // 修改成功则success的值为true
  }
})

2.1 方法 Reflect对象一共有 13 个静态方法。

      Reflect.apply(target, thisArg, args)
      Reflect.construct(target, args)
      Reflect.get(target, name, receiver)
      Reflect.set(target, name, value, receiver)
      Reflect.defineProperty(target, name, desc)
      Reflect.deleteProperty(target, name)
      Reflect.has(target, name)
      Reflect.ownKeys(target)
      Reflect.isExtensible(target)
      Reflect.preventExtensions(target)
      Reflect.getOwnPropertyDescriptor(target, name)
      Reflect.getPrototypeOf(target)
      Reflect.setPrototypeOf(target, prototype)  

上面这些方法的作用,大部分与Object对象的同名方法的作用都是相同的,而且它与Proxy对象的方法是一一对应的。下面是对它们的解释

2.1.1 Reflect.get(target, name, receiver)

查找并返回target对象的name属性,如果没有该属性,则返回undefined。 target必须为对象

    console.log(Reflect.get(target, 'carName')); // "奔驰"
    // 等价于  target.carName

2.1.2 Reflect.set(target, name, value, receiver)

设置target对象的name属性等于value。

    console.log(Reflect.set(target, 'foo', 2));
    // 等价于  target.foo = 2

2.1.3 Reflect.deleteProperty(obj, name)

等同于delete obj[name],用于删除对象的属性。

    console.log(Reflect.deleteProperty(target, 'test'))
    // 等价于  delete target['foo'] 

2.2 get 查找情形2:

var myObject = {
  foo: 1,
  bar: 2,
  get baz() {   // 部署了读取函数(getter),则读取函数的this绑定receiver
    return this.foo + this.bar;
  },
};

var receiverObject = {
  foo: 4,
  bar: 4,
};

console.log(Reflect.get(myObject, 'baz', receiverObject)); // 8