ES6 Proxy

258 阅读1分钟

概述

proxy用于修改对某些操作的默认行为,可以理解成在target之前做一层拦截,外界对该对象的访问,都必须经过这层拦截,因此在这里可以对外界的访问进行一些过滤和修改。

ES6 原生提供 Proxy 构造函数,用来生成 Proxy 实例。

var proxy = new Proxy(target, handler);
  1. new Proxy()表示生成一个Proxy实例
  2. target参数表示所要拦截的目标对象
  3. handler参数也是一个对象,用来定制拦截行为

设置拦截

  1. handler设置get和set方法
var obj = new Proxy({}, {
  get: function (target, propKey, receiver) {
    console.log(`getting ${propKey}!`);
    return Reflect.get(target, propKey, receiver);
  },
  set: function (target, propKey, value, receiver) {
    console.log(`setting ${propKey}!`);
    return Reflect.set(target, propKey, value, receiver);
  }
});

上面的代码对一个空对象架设了一层拦截,重新定义了对象的get和set方法,对设置了拦截行为的对象obj,去读写它的属性,就会得到下面的结果。

obj.count = 1
//  setting count!
++obj.count
//  getting count!
//  setting count!
//  2
  1. 如果handler没有设置任何拦截,那就等同于直接通向原对象。
var target = {};
var handler = {};
var proxy = new Proxy(target, handler);
proxy.a = 'b';
target.a // "b"

上面代码中,handler是一个空对象,没有任何拦截效果,访问proxy就等同于访问target。

Proxy 实例也可以作为其他对象的原型对象

var proxy = new Proxy({}, {
  get: function(target, propKey) {
    return 35;
  }
});

let obj = Object.create(proxy);
obj.time // 35

proxy对象是obj对象的原型,obj对象本身并没有time属性,所以根据原型链,会在proxy对象上读取该属性,导致被拦截

下面是 Proxy 常用的一些操作

  1. get(target, propKey, receiver):拦截对象属性的读取,比如proxy.foo和proxy['foo']。
  2. set(target, propKey, value, receiver):拦截对象属性的设置,比如proxy.foo = v或proxy['foo'] = v,返回一个布尔值。
  3. deleteProperty(target, propKey):拦截delete proxy[propKey]的操作,返回一个布尔值。