总结
在 ES6 之前,特定对象(例如数组)会显示出一些非常规的、无法被开发者复制的行为,而代理的出现改变了这种情况。代理允许你为一些 JS 底层操作自行定义非常规行为,因此你就可以通过代理陷阱来复制 JS 内置对象的所有行为。在各种不同操作发生时(例如对于 in 运算符的使用),这些代理陷阱会在后台被调用。
反射接口也是在 ES6 中引入的,允许开发者为每个代理陷阱实现默认的行为。每个代理陷阱在 Reflect 对象(ES6 的另一个新特性)上都有一个同名的对应方法。将代理陷阱与反射接口方法结合使用,就可以在特定条件下让一些操作有不同的表现, 有别于默认的内置行为。
可被撤销的代理是一种特殊的代理,可以使用 revoke() 函数去有效禁用。revoke() 函数终结了代理的所有功能,因此在它被调用之后,所有与代理属性交互的意图都会导致抛出错误。第三方开发者可能需要在一定时间内获取特定对象的使用权,在这种场合,可被撤销的代理对应用的安全性来说就非常重要。
尽管直接使用代理是最有力的使用方式,但你也可以把代理用作另一个对象的原型。但只有很少的代理陷阱能在作为原型的代理上被有效使用,包括 get、set 与 has 这几个,这让这方面的用例变得十分有限。