15.md 1.7 KB
Newer Older
W
wizardforcel 已提交
1 2
# 十五、代理

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

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

## 代理

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

代码清单 206

W
wizardforcel 已提交
13
```js
W
wizardforcel 已提交
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
  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

W
wizardforcel 已提交
38
```js
W
wizardforcel 已提交
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
  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`