有时候我们要操作一个对象,并不是直接操作,我希望在他外面套一层代理,这个代理用来管理这个对象,我们通过和这个代理进行交互从而间接实现对对象的管理。
基于此,我们要通过和代理进行交互从而管理对象,也就是说直接管理对象的其实是代理,为了管理对象,就必须修改底层实现的方式,可能这样说起来会很抽象,下面看看代理怎么用
js
new Proxy(target,handler);
//这里就创建了一个代理对象,第一个参数为需要代理的对象,第二个参数为普通对象,该对象用来重写底层实现,即前面学过的Reflect中的方法js
const obj = {
a:1,
b:2
}
const proxy = new Proxy(obj,{
//这里面可以重写反射里面的方法,从而自定义
set(target,propertyKey,value){
//这里重写Reflect中的set方法
target[propertyKey] = value+1;//赋值的时候让他赋的值加一
}
});
proxy.a = 10;//对代理进行的所有操作其实都是调用Reflect中的方法实现的,所以这里会调用Reflect方法,但是由于代理中重写了Reflect的set方法,所以这里会调用Reflect的set方法。
console.log(obj.a);//虽然赋值的是10,但是调用的是Reflect的set方法,而这个方法被这个代理重写了,所以调用代理中的set方法,这里输出11这里读者应该能发现,代理实际上就是可以帮助我们管理一个对象,比如我在对这个对象进行一些操作的时候,需要干一些额外的操作,这个时候就要用代理,当然,用以前学过的属性描述符也可以实现类似效果,即 getter 和 setter,但显然没有代理那么强,代理可以重写非常多的方法,Reflect 的所有方法都可以改写。
在代理对象里,会比 Reflect 中的方法多一个参数,即代理对象本身,实际上在 Reflect 中的方法也有这个参数,只不过毫无意义,仅仅是为了格式统一。
如果在重写的代理对象中需要对对象本身进行操作,为了方便阅读,推荐直接使用
Reflect中的方法,而非直接操作对象。