# 十五、代理

代理允许创建具有宿主对象可用的全部行为的对象。它们可用于拦截、对象虚拟化、日志记录、分析等。代理被认为是元编程特性。

| ![](img/00003.gif) | 注意:这是并非所有浏览器或实现都相同的领域之一。以下示例可以在最新版本的 Firefox 或可能的微软 Edge 下运行和测试。 |

## 代理

考虑以下代理普通对象的示例:

代码清单 206

```js
  var target = {};
  var handler = {

  get: function
  (receiver, name) {

  return `Hello, ${name}!`;

  }
  };

  var p = new Proxy(target, handler);
  p.world
  === 'Hello,
  world!';

```

从前面的代码中可以看出，我们的目标是一个简单的对象文字。我们在 getters 上执行代理，它截取 get 并返回字符串`Hello,`加上属性的名称。我们还测试了世界属性是否与字符串`Hello, world!`相同。

我们还来看看代理函数对象:

代码清单 207

```js
  var target = function () { return
  'I am the target'; };
  var handler = {

  apply: function
  (receiver, ...args) {

  return 'I
  am the proxy';

  }
  };

  var p = new Proxy(target, handler);
  p()
  === 'I am the
  proxy';

```

这与前面的例子非常相似，只是我们的目标现在是一个函数。您会注意到，处理程序接受一个接收器和一个扩展运算符(`…`)来处理任意数量的参数。

代理陷阱使您能够拦截和自定义对对象执行的操作。以下是所有运行时级元操作可用的陷阱列表:

*   `get`
*   `set`
*   `has`
*   `deleteProperty`
*   `apply`
*   `construct`
*   `getOwnPropertyDescriptor`
*   `defineProperty`
*   `getPropertyOf`
*   `setPropertyOf`
*   `enumerate`
*   `ownKeys`
*   `preventExtensions`
*   `isExtensible`