一、 定义
Proxy 对象用于定义基本操作的自定义行为(如属性查找、赋值、枚举、函数调用等)。
The Proxy object is used to define custom behavior for fundamental operations (e.g. property lookup, assignment, enumeration, function invocation, etc).
- handler 包含陷阱(trap)的占位符对象,可译为处理器对象。
handler 对象各个属性通常为函数,这些函数构成了对 被代理对象的 捕获器(trap) - traps 提供属性访问的方法。这类似于操作系统中捕获器的概念,一般直译作陷阱。
- target 被 Proxy 代理虚拟化的对象。它常被作为代理的存储后端。根据目标验证关于对象不可扩展性或不可配置属性的不变量(保持不变的语义)。
二、 一个完整的 traps 列表示例
1 | var docCookies = new Proxy(docCookies, { |
三、 handler 对象的方法
handler 对象是一个容纳一批特定属性的占位符对象。它包含有 Proxy 的各个捕获器(trap)。
所有的陷阱是可选的。如果没有定义某个陷阱,那么就会保留源对象的默认行为。
1) handler.get(): A trap for getting property values.
1 | function get(obj, defaultVal) { |
2) handler.set(): A trap for setting property values.
拦截设置,做校验
1 | // 验证规则 |
3) handler.apply(target, context, args): A trap for a function call.
拦截函数的调用,交由 handler.apply
函数内部如何执行这个 函数
target
被代理的函数context
为函数执行的上下文args
为一个数组,即传入给 代理对象的参数 会被自动转换为一个数组
1 | function test() { |
4) handler.construct(target, args, newTarget): A trap for the new operator.
拦截 构造函数实例化的过程,交由 handler.construct
内部执行具体的 构造函数实例话的过程
target
为被代理的 构造函数args
为数组,即传入给构造函数的参数被转换为也给数组newTarget
为 Proxy 对象,即被代理后返回的对象
1 | function Person(name, age) { |
5) handler.defineProperty(): A trap for Object.defineProperty.
拦截了 Object.defineProperty(obj, key, descriptor)
的行为,可以重新赋值
1 | let obj = { |