什么是代理
- 本质上:是一个对象,但这个对象不额外占据空间,还是使用原对象的空间。
- 理解:给 原本的目标对象 外面套了一层 包包的壳,外界访问目标对象时,让代理 出马解决,与外界进行交互信息,外界和目标对象不会真实直接接触。就是协助原对象处理外界事务的。
- 现实类比: 《打官司》:目标对象就是当事人,代理就是律师,有什么事情和律师谈
创建一个代理
// 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 里的函数。细品~
这就是他们之间的关系。