《第9章 代理与反射》

一、代理基础

  • 捕获器就是在处理程序对象中定义的“基本操作的拦截器”。每个处理程序对象可以包含零个或多个捕获器,每个捕获器都对应一种基本操作,可以直接或间接在代理对象上调用。每次在代理对象上调用这些基本操作时,代理可以在这些操作传播到目标对象之前先调用捕获器函数,从而拦截并修改相应的行为。

二、代理捕获器与反射方法

基本操作
get() 捕获器会在获取属性值的操作中被调用。对应的反射API 方法为 Reflect.get()
set() 捕获器会在设置属性值的操作中被调用。对应的反射API 方法为Reflect.set()
has() 捕获器会在in 操作符中被调用。对应的反射API 方法为Reflect.has()
defineProperty() 捕获器会在Object.defineProperty() 中被调用。对应的反射API 方法为Reflect.defineProperty()
getOwnPropertyDescriptor() 捕获器会在 Object.getOwnPropertyDescriptor() 中被调用。对应的反射API 方法为Reflect.getOwnPropertyDescriptor()
deleteProperty() 捕获器会在 delete 操作符中被调用。对应的反射API 方法为 Reflect.deleteProperty()
ownKeys() 捕获器会在Object.keys()及类似方法中被调用。对应的反射API 方法为Reflect.ownKeys()
getPrototypeOf()捕获器会在Object.getPrototypeOf()中被调用。对应的反射API 方法为Reflect.getPrototypeOf()
setPrototypeOf() 捕获器会在Object.setPrototypeOf() 中被调用。对应的反射API 方法为Reflect.setPrototypeOf()
isExtensible() 捕获器会在Object.isExtensible() 中被调用。对应的反射API 方法为 Reflect.isExtensible()
preventExtensions()捕获器会在Object.preventExtensions()中被调用。对应的反射API方法为Reflect.preventExtensions()。
apply() 捕获器会在调用函数时中被调用。对应的反射API 方法为Reflect.apply()
construct() 捕获器会在new 操作符中被调用。对应的反射API 方法为Reflect.construct()

三、代理模式

编程模式功能
跟踪属性访问通过捕获get、set 和has 等操作,可以知道对象属性什么时候被访问、被查询。把实现相应捕获
器的某个对象代理放到应用中,可以监控这个对象何时在何处被访问过
隐藏属性代理的内部实现对外部代码是不可见的,因此要隐藏目标对象上的属性也轻而易举
属性验证因为所有赋值操作都会触发set()捕获器,所以可以根据所赋的值决定是允许还是拒绝赋值
函数与构造函数参数验证跟保护和验证对象属性类似,也可对函数和构造函数参数进行审查。比如,可以让函数只接收某种类型的值
数据绑定与可观察对象通过代理可以把运行时中原本不相关的部分联系到一起。这样就可以实现各种模式,从而让不同的代码互操作
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值