1.概述

Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,属于一种”元编程”,即对编程语言进行编程。

Proxy可以理解成,在目标对象之前设一层”拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供一种机制,可以对外界的访问进行过滤和改写。Proxy这个词的原意是代理,用在这里表示由它来“代理”某些操作,可以译成为”代理器”。
ES6 原生提供了Proxy构造函数,用来生成Proxy实例。
Proxy 对象的所有的用法,都是上面这种形式,不同的是handler参数的写法。其中,new Proxy() 表示生成一个Proxy实例,target 参数表示是所要拦截的目标对象,handler 参数也是一个对象,用来定制拦截行为。

  1. var proxy = new Proxy(target, handler);

代码中,作为构造函数,proxy接受两个参数,第一个参数是所要代理的目标对象(这里是一个空对象),即如果没有proxy的介入,操作原来要访问的就是这个这个对象;第二个参数是一个配置对象,对于每一个被代理的操作,需要提供一个对应的处理函数,该函数将拦截对应的操作。比如,上面代码中,配置对象有一个get方法,用来拦截对目标对象属性的访问的请求。get的方法的两个参数分别是目标对象和所要访问的属性。可以看到,由于拦截函数总是返回35。
注意,要使得Proxy起作用,必须针对Proxy 实例(这里是Proxy 对象)进行操作,而不是针对目标对象进行操作(这里是空对象)进行操作。如果handler没有设置任何的拦截,那就等同于直接通向原对象。
代码中,handler是一个空对象,没有任何拦截效果,访问proxy就等同访问target。

  1. //对handler 进行操作
  2. var proxy = new Proxy({}, {
  3. get: function(target, propKey) {
  4. return 35;
  5. }
  6. });
  7. proxy.time // 35
  8. proxy.name // 35
  9. proxy.title // 35
  10. //对handler 不进行操作
  11. var target = {};
  12. var handler = {};
  13. var proxy = new Proxy(target, handler);
  14. proxy.a = 'b';
  15. target.a // "b"

2.Proxy实例的方法

get()
get方法用于拦截某个属性的读取操作,可以接受三个参数,依次为目标对象、属性名和proxy实例本身(严格的说,是操作行为所针对的对象),其中最后一个参数可选。