06-代理

nobility 发布于 2022-12-29 02-ES6 2792 次阅读


代理

通过一个代理对象,通过对代理对象操作,间接的对原对象的操作,这就是代理

虽然可以为某个属性设置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是代理对象本身 返回值是创建的对象,所以必须返回一个对象作为创建的对象
加油啊!即便没有转生到异世界,也要拿出真本事!!!\(`Δ’)/
最后更新于 2022-12-29