文章目录
一、代理
代理时对目标的抽象
1.创建代理
(1)代理是使用Proxy构造函数创建的,该函数接收两个参数,目标对象和处理程序对象.
2.定义捕获器
使用代理的目的是可以定义捕获器.捕获器就是在处理程序对象中定义的"基本操作的拦截器"
3.捕获器参数和API
(1)所有捕获器都可以访问相应的参数,基于这些参数可以重建被捕获方法的原始行为.
(2)处理程序对象中所有可以捕获的方法都有对应的反射(Reflect)API方法.
4.捕获器不变式
每个捕获的方法都知道目标对象上下文,捕获函数签名,而捕获处理程序的行为必须遵循"捕获器不变式"
5.可撤销代理
6.代理的问题与不足
(1)代理中的this
(2)代理与内部槽位
二、反射
1.实用反射操作
(1)反射API和对象API
反射API并不限于捕获处理程序
大多数反射API方法在Object类型上有对应的方法
(2)状态标记,很多反射方法返回称作"状态标记"的布尔值,表示意图执行的操作是否成功.
(3)用一等函数替代操作符
Reflect.get()可以替代对象属性操作符
Reflect.set()可以替代=赋值操作符
has()可以替代in操作符或with()
deleteProperty()可以替代delete操作符
construct()可以替代new操作符
(4)安全地应用函数
Reflect.apply(myFunc,thisVal,argumentList);
三、代理模式
1.跟踪属性访问
通过get,set,has等操作,可以知道对象属性什么时候被访问,被查询.把实现响应捕获器的某个对象放到应用中,可以监控这个对象何时在何处被访问过
2.隐藏属性
代理的内部实现对外部代码是不可见的
3.属性验证
所有赋值操作都会触发set()捕获器,所以可以根据所赋的值决定是允许还是拒绝赋值
4.函数与构造函数参数验证
对函数和构造函数的参数进行审查
5.数据绑定和可观察对象
通过代理可以把运行时中原本不相关的部分联系到一起.
本文含有隐藏内容,请 开通VIP 后查看