时隔两年后二刷JavaScript高级程序语言,纯手打读书笔记+思维导图,让自己有一个比较全面的知识体系,后面有遇到例子的时候会慢慢补充更多的用法。有不足之处欢迎大家评论区指出,共勉!!
代理和反射可以拦截对目标对象的操作,必须通过操作代理才能实现拦截。代理是真实JS对象的透明抽象层。反射API封装了一整套与捕获器拦截的操作相对应的方法,
一、代理基础
- 创建一个代理
var proxy = Proxy(目标对象,处理程序对象)
给目标或代理的属性赋值,两个对象都会有反应,因为代理会将赋值转移到目标对象上。
但Proxy.prototype是undefined,所以不能对proxy使用instanceof操作符。
- 定义捕获器
捕获器:在处理程序对象中定义的“基本操作的拦截器”,拦截并修改对基本对象的操作。
// 捕获器在处理程序对象中以方法名为键,
get() {
return 'handler override';
}
};
3、捕获器参数和反射API
反射:全局 Reflect 对象,封装了原始行为,通过调用例如Reflect.get()来重建get捕获器。
4、捕获器不变式:
防止捕获器定义出现过于反常的行为。
5、可撤销代理
const { proxy, revoke } = Proxy.revocable(target, handler); //同时定义proxy代理和revoke撤销代理函数。
revoke();//执行撤销函数即可终止proxy与对象的代理关系。
二、代理捕获器与反射方法
Reflect.get():在获取属性的值时调用。
get(trapTarget, property, receiver) { //目标对象,访问的属性,代理对象,return无限制
不变式:不可写且不可配置,返回一个与属性值不同的值时会报错。
Reflect.set():设置属性值时调用。
set(target, property, value, receiver) {//,,设置的值,接受最初赋值的对象,return布尔
不变式:不可写且不可配置,修改属性值时会报错。
Reflect.has():in操作符
has(target, property) {//目标对象,属性 ,return布尔
不变式:存在属性,且不可配置或不可拓展,则必须返回true。
Reflect.defineProperty():Object.defineProperty()
defineProperty(target, property, descriptor) { //,,配置对象,return布尔
不变式:不可拓展则无法定义属性,有一个配置,则不可定义同名的且与其configurable相反的属性
Reflect.getOwnPropertyDescriptor():Object.getOwnPropertyDescriptor()
getOwnPropertyDescriptor(target, property) { //目标对象,属性,return对象
Reflect.deleteProperty():delete操作符
deleteProperty(target, property) {//return布尔
不变式:属性存在且不可配置,则不能删除属性
Reflect.ownKeys():Object.keys()及类似方法中被调用
ownKeys(target) { //目标对象,返回可枚举对象
Reflect.getPrototypeOf():Object.getPrototypeOf()调用
getPrototypeOf(target) { //返回目标对象的原型
Reflect.setPrototypeOf():Object.setPrototypeOf()调用
setPrototypeOf(target,prototype) { //目标对象,原型,返回布尔
Reflect.isExtensible():Object.isExtensible()调用
isExtensible(target) { { //返回布尔,表示对象是否可拓展
Reflect.preventExtensions():Object.preventExtensions()调用
preventExtensions(target) { { //返回布尔,表示对象是否是否已经不可扩展
Reflect.apply():在调用函数时(apply或call)被调用
apply(target, thisArg, ...argumentsList) {//目标对象,this参数,参数列表
Reflect.construct():在使用new时
construct(target, argumentsList, newTarget) {//构造函数,参数列表,最初被调用的构造函数
三、代理模式
通过代理可以实现一些有用的编程模式
1、跟踪属性的访问
2、隐藏属性:在get中return undefined
3、属性值验证:set中对值进行验证
4、函数与构造函数参数验证:在apply或construct中对参数进行验证