ES6 学习笔记(9) Proxy

2018-03-13  本文已影响0人  MrZhou_b216

1. 概述

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

  proxy.time // 35
  proxy.name // 35
  proxy.title // 35

下面是 Proxy 支持的拦截操作一览,一共 13 种。

3. Proxy.revocable()

Proxy.revocable方法返回一个可取消的 Proxy 实例。

  let target = {};
  let handler = {};

  let {proxy, revoke} = Proxy.revocable(target, handler);

  proxy.foo = 123;
  proxy.foo // 123

  revoke();
  proxy.foo // TypeError: Revoked

Proxy.revocable的一个使用场景是,目标对象不允许直接访问,必须通过代理访问,一旦访问结束,就收回代理权,不允许再次访问。

4. this 问题

虽然 Proxy 可以代理针对目标对象的访问,但它不是目标对象的透明代理,即不做任何拦截的情况下,也无法保证与目标对象的行为一致。主要原因就是在 Proxy 代理的情况下,目标对象内部的this关键字会指向 Proxy 代理。

5. 实例:Web 服务的客户端

Proxy 对象可以拦截目标对象的任意属性,这使得它很合适用来写 Web 服务的客户端。

  const service = createWebService('http://example.com/data');

  service.employees().then(json => {
    const employees = JSON.parse(json);
    // ···
  });

上面代码新建了一个 Web 服务的接口,这个接口返回各种数据。Proxy 可以拦截这个对象的任意属性,所以不用为每一种数据写一个适配方法,只要写一个 Proxy 拦截就可以了。

  function createWebService(baseUrl) {
    return new Proxy({}, {
      get(target, propKey, receiver) {
        return () => httpGet(baseUrl+'/' + propKey);
      }
    });
  }
上一篇下一篇

猜你喜欢

热点阅读