Reflect

Reflect 是一个内置的对象,他提供了一些方法来 操作对象 的属性和方法, 并且它还提供 拦截 JavaScript 操作 的方法。这些方法与 proxy handler (en-US) 的方法相同。Reflect 不是一个函数对象,因此它是不可构造的。

Reflect.get(target, propertyKey[, receiver]) 获取对象的属性值


    const obj = {name:'Mowang',age:20}

    console.log(Reflect.get(obj,'name')) // 输出 Mowang

Reflect.set(target, propertyKey, value[, receiver]) 设置对象的属性值

    const obj = {name:'Mowang',age:20}
    
    Reflect.set(obj,'age',22)

    console.log(obj['age']) // 输出 22

Reflect.has(target, propertyKey) 判断对象是否具有指定的属性

    const obj = {name:'Mowang',age:20}
    
    const hasName = Reflect.has(obj,'name')

    console.log(hasName) // 输出 true

Reflect.deleteProperty(target, propertyKey) 删除对象的属性

    const obj = {name:'Mowang',age:20}
    
    Reflect.deleteProperty(obj,'age')

    console.log(obj) // 输出 { name:'Mowang' }

Reflect.construct(target, argumentsList[, newTarget]) 使用给定的参数列表创建一个对象实例

    class Person {
        constructor(name,age){
            this.name = name;
            this.age = age
        }
    }

    const args = ['Mowang',20];
    const person = Reflect.construct(Person,args)
    
    console.log(person) // 输出 {name:'Mowang',age:20}

这只是他的常用方法,他还有一些其他的函数

    - Reflect.apply(target, thisArgument, argumentsList)  # 通过指定的参数列表发起对目标 (target) 函数的调用
    - Reflect.get(target, propertyKey[, receiver]) # 从已有的对象种读取去属性值
    - Reflect.has(target, propertyKey) # 判断目标对象中是否存在这个属性
    - Reflect.set(target, propertyKey, value[, receiver]) # 修改或者设置一个属性
    - Reflect.isExtensible(target) # 判断这个对象是否可拓展 如果可以拓展我们就可以增加新属性 ,比如 Reflect || Object.preventExtensions(target) 设置过的属性就是不可拓展的
    - Reflect.ownKeys(target) # 返回一个以目标属性键值的数组 比如 const obj = {name:'Mowang', age:20 }  Reflect.ownKeys(obj) 返回结果为 ['name','age']
    ...
    // 举几个常用的 , 剩下的阅读MDN https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Reflect

Reflect 是一个内置的 JS 对象,它提供了一系列方法,可以让开发者通过调用这些方法,访问一些 JS 底层功能。也就是说,从 Reflect 对象上可以拿到语言内部的方法

配合 proxy 使用

let p = {
    a: 'a'
};

let handler = {
  set(target, key, value, receiver) {
    console.log('set');
    Reflect.set(target, key, value, receiver)
  },
  defineProperty(target, key, attribute) {
    console.log('defineProperty');
    Reflect.defineProperty(target, key, attribute);
  }
};

let obj = new Proxy(p, handler);
obj.a = 'A';
// set
// defineProperty

如果 Proxy 对象和 Reflect 对象联合使用,前者拦截赋值操作,后者完成赋值的默认行为,而且传入了 receiver,那么 Reflect.set 会触发 Proxy.defineProperty 拦截

参考文档 MDN - Reflect