代理 Proxy

68 阅读1分钟

什么是代理

  • 本质上:是一个对象,但这个对象不额外占据空间,还是使用原对象的空间。
  • 理解:给 原本的目标对象 外面套了一层 包包的壳,外界访问目标对象时,让代理 出马解决,与外界进行交互信息,外界和目标对象不会真实直接接触。就是协助原对象处理外界事务的。
  • 现实类比: 《打官司》:目标对象就是当事人,代理就是律师,有什么事情和律师谈

创建一个代理

// new 一个 Proxy 对象
const proxy = new Proxy(target,handler)

// handler 是这个 代理需要做的一些具体的处理,常见的处理是:拦截访问器:get,set...
const handler = {
   // 拦截并重写了 底层的 get 方法:
    get(target,propertyKey,value,reciever){
       // 做一些自己想做的操作
       ...
       // 调用Reflect底层方法实现应有的功能
       Reflect.get(target,propertyKey,value,reciever)
    },
   // 其他的底层方法
   ...
}

// 注意:reciever 是代理对象

代理的作用

拦截并重写底层API,即在进行原对象的基本操作的同时,能做一些“自己想做的事”。不然,代理和原始对象还有什么区别呢,肯定是得有更强大的功能啊。

如何实现重写

使用反射。

反射的API对应了一系列底层方法,而代理拦截的方法 和 反射的API也是一一对应的。所以使用反射来实现方法的重写。


反射与代理的关系

代理就是提供了重写反射里面的API的机制,让用户也能参与底层操作。Proxy 就是重写的 Reflect 里的函数。细品~

这就是他们之间的关系。