# 十五、代理 代理允许创建具有宿主对象可用的全部行为的对象。它们可用于拦截、对象虚拟化、日志记录、分析等。代理被认为是元编程特性。 | ![](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`