代理
通过一个代理对象,通过对代理对象操作,间接的对原对象的操作,这就是代理
虽然可以为某个属性设置setter/getter方法,但是这种操作是为多个属性设置时会略显繁琐,而且setter/getter方法能力有限,只能拦截存器操作
构造函数
- 必须使用构造函数
new出来才行,否则会报错 - 必须有两个参数,第一个参数是原对象
target,第二个参数是代理配置对象handler - 返回一个代理对象,通过该代理对象间接的操作原对象
- 若一个对象的原型对象是代理对象,则从使用该原型对象上的属性时会拦截,而对于自身就有的不会拦截,也就是说从代理对象上获取值才会受到拦截
静态方法
Proxy.Revocable ()这是一个函数,所以不要使用new关键字,返回一个可撤销代理的代理对象,以{proxy: 代理对象, revoke: revoke ()},代理对象就和使用构造函数返回的没有区别,revoke ()一旦执行,该代理对象就被收回了
Var proxy = Proxy.Revocable ({}, {});
Console.Log (proxy); //{ proxy: [Function: fun], revoke: [Function] }
Proxy. Proxy. Id = 1; //设置值需要使用该返回对象返回的代理对象
Console.Log (proxy. Proxy. Id); //获取设置的属性
Proxy.Revoke (); //撤销代理
Console.Log (proxy); //TypeError,因为被垃圾回收机制回收所以抛出错误
配置对象中的拦截方法
这里所有的拦截方法中的参数都可以省略
| 方法名 | 拦截操作 | 参数描述 | 返回值要求 |
|---|---|---|---|
handler.Get (target, propKey, receiver) |
拦截属性取值操作 | target是原对象,propKey是原对象属性,receiver是代理对象本身 |
返回值就是获取对象的属性值,无要求 |
handler.Set (target, propKey, value, receiver) |
拦截属性设置操作 | target是原对象,propKey是原对象属性,value是设置的属性值,receiver是代理对象本身 |
最好返回true代表设置成功,不要返回false若是严格模式返回false会报错 |
handler.Has (target, propKey) |
拦截in运算符判断该对象是否有该属性操作 |
target是原对象,propKey是原对象属性 |
必须返回一个布尔值代表该属性是否存在 |
handler.DeleteProperty (target, propKey) |
拦截delete删除对象属性操作 |
target是原对象,propKey是原对象属性 |
必须返回一个布尔值代表是否删除成功 |
handler.Apply (target, thisTar, args) |
拦截该函数对象被当作函数调用时的操作,包括call ()方法和apply ()方法 |
target是原对象,thisTar是函数被调用时的 this 指向,args是实参数组形式 |
返回值就是函数调用的返回值,无要求 |
handler.Construct (target, args, receiver) |
拦截该函数对象被当作构造函数使用创建的操作,包括new和反射创建 |
target是原对象,args是实参数组形式,receiver是代理对象本身 |
返回值是创建的对象,所以必须返回一个对象作为创建的对象 |

Comments NOTHING