代理与反射是什么?
通过调用 new Proxy(),你可以创建一个代理用来替代另一个对象( 被称为目标),这个代理对目标对象进行了虚拟,因此该代理与该目标对象表面上可以被当作同一个对象来对待。
代理允许你拦截在目标对象上的底层操作,而这原本是 JS 引擎的内部能力。拦截行为使用了一个能够响应特定操作的函数(被称为陷阱)。
被 Reflect 对象所代表的反射接口,是给底层操作提供默认行为的方法的集合,这些操作是能够被代理重写的。每个代理陷阱都有一个对应的反射方法,每个方法都与对应的陷阱函数同名,并且接收的参数也与之一致。下表总结了这些行为:

每个陷阱函数都可以重写 JS 对象的一个特定内置行为,允许你拦截并修改它。如果你仍然需要使用原先的内置行为,则可使用对应的反射接口方法。一旦创建了代理,你就能清晰了解代理与反射接口之间的关系,因此我们最好通过一些例子来进行深入研究。
ES6 的原始草案还有一个名为 enumerate 的陷阱函数,其设计意图是更改 for-in 与 Object.keys() 在对象上进行属性枚举的机制。然而,该陷阱函数在 ECMAScript 7(也被称为 ECMAScript 2016)中被移除了,因为它太难于实现。enumerate 陷阱函数不会再出现在任何 JS 运行环境中,也不会在本章进行介绍。 |