什么是Proxy
proxy翻译过来是代理,它也确实起了代理的作用,代理了我们访问对象的行为。
代理就像是一样中间人,我们的行为都是通过中间人来传递话。至于中间人会不会对我们的行为进行处理以及怎么处理,那是在代理中设定的。
new Proxy('被设置代理的对象',option)
一个代理由两部分组成,第一部分就是被设定代理的对象,另外一部分就是代理对于访问者的行为进行如何处理
行为分类
1.get()
拦截对某个属性的访问操作,他有两个参数第一个是对象,第二个是属性
new Proxy({},{
get(){}})
2.set()
拦截对某个属性的修改,他有三个参数第一个是对象,第二个是属性,第三个是新值
还有一些行为等需要的再去看看如何操作
this指针指向问题
假设我们再对proxy对象的行为不做处理的时候,通过proxy访问一个属性,这个属性可能与我们直接通过实例访问属性不一致,这个不一致来自于this指针的不一致,this指针在通过proxy实例访问的时候是指向proxy实例。
Reflect
首先要明确一个概念,Reflect是一个静态对象,不要我们实例化也不需要我们修改,我们只是使用上面的方法
Reflect设计目的
1.将Object上面明显属于语言内部的方法(这个词语的定义暂时没有找到好的描述)移交到Reflect,同时后续对Object添加的新api也移交到Reflect上,相当于它们两是交集的关系
2.和Proxy结合起来,Proxy上面有很多行为,这些行为都可以通过Reflect上的方法调用起来
success = Reflect.set(target,name, value);
比如这样就调用了一次设置属性的方法,target写入为Proxy对象,那么为属性
3.将一些操作变成函数式的,举几个例子
delete a.age
'name' in a
这两个方法一个是删除属性,一个是判断属性是否在某个对象
转换时候就变成Reflect.has(),Reflect.deleteProperty().
实际上也和目的2相呼应了
4.修改某些Object方法的返回结果,让其变得更合理。