js Reflect的理解

117 阅读2分钟

reflect

一句话就是调用对象的基本方法

因为js对象很多操作方法是没有暴露出来的,通过封装好的语法调用就好,通过reflect就可以调用js对象的基本方法,具体可以调用哪些可以去MDN查看。

MDN解释:Reflect 是一个内置的对象,它提供拦截 JavaScript 操作的方法。这些方法与 proxy handler 的方法相同。Reflect 不是一个函数对象,因此它是不可构造的。 developer.mozilla.org/zh-CN/docs/…

下面举几个例子来帮助理解:

获取对象属性简单例子:

当我们使用语法读取对象属性,可以理解成实际上执行时候会执行一个被封装过后的方法,然后在封装方法中调用对象的基本方法get获取对象内容。

      let obj = {
        a:1,
        b:2,
         get c() {
            return this.a + this.b;
         }
      }

   console.log(obj.c);// 当我们使用语法读取对象属性,实际上执行时候会执行一个被封装过后的方法,然后在封装方法中调用对象的基本方法
   console.log(Reflect.get(obj,'c'));// 调用对象的基本方法,通过get调用
   console.log(Reflect.get(obj,'c',{a:10,b:30}));// 调用对象的基本方法,第三个参数receiver指定this指向,返回40

获取对象所有属性例子:

js对象基本方法有个 ownKeys 用来获取对象所有属性, 返回一个包含所有自身属性(不包含继承属性)的数组


    let obj = {
        a:1,
        b:2,
         get c() {
            return this.a + this.b;
         }
      }

      // 获取对象所有属性
      // 先添加一个不可枚举的属性
      Object.defineProperty(obj,'d',{
        value:4,
        enumerable:false
      })
      console.log(Object.keys(obj));// 获取对象所有属性,但是正常调用的封装方法会过滤掉不可枚举的
      console.log(Reflect.ownKeys(obj));// 通过直接调用基本方法获取,获取对象所有属性



proxy代理例子:

通过指定receiver保证了this指向无误

      let obj = {
        a:1,
        b:2,
         get c() {
            return this.a + this.b;
         }
      }

      // 代理例子

      const proxy = new Proxy(obj,{
        get(target,key,receiver) {
          console.log('get',target,key,receiver);
          // 如果不设置receiver,获取c的时候,此时c的this是target,也就是原始对象obj,而不是代理对象proxy
           // 所以获取c的时候,只监听到了c,没有监听到a,b的获取
        //   return Reflect.get(target,key);   
          return Reflect.get(target,key,receiver);  
        }
      })

      console.log(proxy.c);// 调用对象的基本方法