- 代理是目标对象的抽象。目标对象可以直接被操作,也可以通过代理来操作。
- 代理通过Proxy构造函数创建。接受两个参数,分别是目标对象和处理程序对象。const person = { name:'张三', age:18 } const proxy = new Proxy(person,{})
-
const person = { name:'张三', age:18 } //创建p为person的空代理,修改p的值,person也会变化 const p = new Proxy(person,{})
- 捕获器(在处理程序中定义的基本操作的拦截器),每次在代理对象上调用这些基本操作时,代理可以在这些操作传播至目标对象之前调用捕获器函数,从而拦截修改相应的行为。
-
const person = { name:'张三', age:18 } //创建p为person的空代理,修改p的值,person也会变化 const p = new Proxy(person,{ //get方法会接受三个参数,分别是目标对象,要查询的属性,代理对象。 //通过这三个参数,可以重建被捕获方法的原始行为 //get(目标对象,要查询的属性,代理对象){ //} get(trapTarget, property, receiver) { return trapTarget[property]; } set(){ } })
-
手动重建原始行为比较困难。可以通过Reflect对象上封装的同名方法轻松重建。
-
捕获器不变式,防止捕获器定义时出现过于反常的行为。比如,当目标对象有一个不可配置且不可写的属性时,如果捕获器返回一个与该属性不同的值时,会抛出错误。
-
可撤销代理,中断代理对象与目标对象之间的关系。通过revocable()方法实现。代理撤销是不可逆的,撤销后再使用代理,会报错。
const target = { foo: 'bar' }; const handler = { get() { return 'intercepted'; } }; const { proxy, revoke } = Proxy.revocable(target, handler); console.log(proxy.foo); // intercepted console.log(target.foo); // bar revoke(); console.log(proxy.foo); // TypeError
-
反射API与对象API,反射API并不仅限于捕获处理程序,大多数反射API方法在Object类型上有对应的方法。很多反射方法返回状态标记布尔值,表示执行的操作是否成功,执行失败知识会返回false,而不是报错终止代码执行。而对象API执行错误后就直接终止了,程序不够健壮。
Reflect.get():可以替代对象属性访问操作符。 Reflect.set():可以替代=赋值操作符。 Reflect.has():可以替代 in 操作符或 with()。 Reflect.deleteProperty():可以替代 delete 操作符。 Reflect.construct():可以替代 new 操作符。
-
代理另一个代理。在一个对象上构建多层拦截网。