# 什么是代理模式
代理模式,顾名思义,就是你不能去直接的操作某个对象的属性或者方法,你需要通过一个`代理`去访问。
# javascript中的代理模式
javascript中的Proxy对象就是一个代理模式的实现,在创建Proxy对象的时候,除了传入需要被代理的原始对象以外,还需要传入handler对象,handler对象中是一些方法,例如下面的get和set,它们会在特定的场景被调用。比如get会在取值时被调用。handler中还有很多别的方法,具体可以看mdn中关于Proxy的内容。
const obj = {
a: 1,
b: 2,
c: 3,
};
const proxyObj = new Proxy(obj, {
get(obj, prop) {
console.log("in get");
return obj[prop];
},
set(obj, prop, value) {
console.log("in set");
obj[prop] = value;
},
});
proxyObj.a // in get
proxyObj.b = 222 // in set
我觉得ES6中的Proxy相比于我们去定义一个CustomProxy,然后去代理,它的好处在于:
- 这是浏览器原生支持的
- 我们可以像操作原始对象一样操作代理对象,并不需要特殊操作
那么代理模式在javascript中可以做什么?我觉得用于改造旧代码应该还挺不错的,在不改变原本操作逻辑的基础上,做一些修改。除了这个,进行一些校验工作也是不错的。
# Proxy & Reflect
在javascript中,Proxy经常与Reflect一起用(我也不知道为啥),Reflect对象提供了几个方法,我们可以通过这些方法取到原始对象的属性。那这里的原始对象是什么?原始对象就是你传给Reflect的那个对象,也就是说,如果你传了一个Proxy对象给它,它所取的值也是通过该Proxy对象去取的,并且它不会unproxy。Reflect常用于Proxy对象的handler中,可以很方便的取原始对象的属性,但是我目前也不是很清楚这个的好处在哪,以后知道了再补充一下。