一、代理基础
- 捕获器就是在处理程序对象中定义的“基本操作的拦截器”。每个处理程序对象可以包含零个或多个捕获器,每个捕获器都对应一种基本操作,可以直接或间接在代理对象上调用。每次在代理对象上调用这些基本操作时,代理可以在这些操作传播到目标对象之前先调用捕获器函数,从而拦截并修改相应的行为。
二、代理捕获器与反射方法
基本操作 |
---|
get() 捕获器会在获取属性值的操作中被调用。对应的反射API 方法为 Reflect.get() |
set() 捕获器会在设置属性值的操作中被调用。对应的反射API 方法为Reflect.set() |
has() 捕获器会在in 操作符中被调用。对应的反射API 方法为Reflect.has() |
defineProperty() 捕获器会在Object.defineProperty() 中被调用。对应的反射API 方法为Reflect.defineProperty() |
getOwnPropertyDescriptor() 捕获器会在 Object.getOwnPropertyDescriptor() 中被调用。对应的反射API 方法为Reflect.getOwnPropertyDescriptor() |
deleteProperty() 捕获器会在 delete 操作符中被调用。对应的反射API 方法为 Reflect.deleteProperty() |
ownKeys() 捕获器会在Object.keys()及类似方法中被调用。对应的反射API 方法为Reflect.ownKeys() |
getPrototypeOf()捕获器会在Object.getPrototypeOf()中被调用。对应的反射API 方法为Reflect.getPrototypeOf() |
setPrototypeOf() 捕获器会在Object.setPrototypeOf() 中被调用。对应的反射API 方法为Reflect.setPrototypeOf() |
isExtensible() 捕获器会在Object.isExtensible() 中被调用。对应的反射API 方法为 Reflect.isExtensible() |
preventExtensions()捕获器会在Object.preventExtensions()中被调用。对应的反射API方法为Reflect.preventExtensions()。 |
apply() 捕获器会在调用函数时中被调用。对应的反射API 方法为Reflect.apply() |
construct() 捕获器会在new 操作符中被调用。对应的反射API 方法为Reflect.construct() |
三、代理模式
编程模式 | 功能 |
---|---|
跟踪属性访问 | 通过捕获get、set 和has 等操作,可以知道对象属性什么时候被访问、被查询。把实现相应捕获 器的某个对象代理放到应用中,可以监控这个对象何时在何处被访问过 |
隐藏属性 | 代理的内部实现对外部代码是不可见的,因此要隐藏目标对象上的属性也轻而易举 |
属性验证 | 因为所有赋值操作都会触发set()捕获器,所以可以根据所赋的值决定是允许还是拒绝赋值 |
函数与构造函数参数验证 | 跟保护和验证对象属性类似,也可对函数和构造函数参数进行审查。比如,可以让函数只接收某种类型的值 |
数据绑定与可观察对象 | 通过代理可以把运行时中原本不相关的部分联系到一起。这样就可以实现各种模式,从而让不同的代码互操作 |