首页
AI Coding
数据标注
NEW
沸点
课程
直播
活动
APP
插件
搜索历史
清空
创作者中心
写文章
发沸点
写笔记
写代码
草稿箱
创作灵感
查看更多
登录
注册
JS高级程序设计-代理与反射
CQY
创建于2022-05-13
订阅专栏
在线学习JS高级程序设计,加强基础知识。好记性不如烂笔头
暂无订阅
共25篇文章
创建于2022-05-13
订阅专栏
默认顺序
默认顺序
最早发布
最新发布
函数与构造函数参数验证
函数与构造函数参数验证 跟保护和验证对象属性类似,也可对函数和构造函数参数进行审查。比如,可以让函数只接受某种类似的值: 类似地,可以要求实例化时必须给构造函数传参
属性验证
属性验证 因为所有赋值操作都会触发 set()捕获器,所以可以根据所赋的值决定是允许还是拒绝赋值,例如:
隐藏属性
隐藏属性 代理的内部实现对外部代码是不可见的,因此要隐藏目标对象上的属性也轻而易举。不如以下代码实现:
跟踪属性访问
跟踪属性访问 通过捕获 get , set 和 has 等操作,可以知道对象属性什么时候被访问、被查询。把实现相应捕获器的某个对象代理放到应用中,可以监控这个对象何时在何处被访问过。
construct()
construct() construct()捕获器会在 new 操作符中被调用。对应的反射 API 方法为 Reflect.construct() 返回值 construct()必须返回一个对象 拦
apply()
apply() apply()捕获器会在调用函数时中被调用。对应的反射 API 方法为 Reflect.apply(). 返回值 返回值无限 拦截的操作 捕获器程序处理参数 target: 目标对象;
preventExtensions()
preventExtensions() preventExtensions()捕获器会在 Object.preventExtensions()中被调用。对应的反射 API 方法为 Reflect.pr
isExtensible()
isExtensible() isExtensible()捕获器会在 Object.isExtensible()中被调用。对应的反射 API 方法为 Reflect.isExtensible() 返回
setPrototypeOf()
setPrototypeOf() setPrototypeOf()捕获器会在 Object.setPrototypeOf()中被调用。对应的反射 API 方法为 Reflect.setPrototyp
getPrototypeOf()
getPrototypeOf() getPrototypeOf()捕获器会在 Object.getPrototypeOf()中被调用。对应的反射 API 方法为 Reflect.getPrototyp
ownKeys()
ownKeys() ownKeys() 捕获器会在 Object.keys()及类似的方法中被调用。对应的反射 API 方法为 Reflect.ownKeys()。 返回值 ownKeys()必须返回
deleteProperty()
deleteProperty() deleteProperty()捕获器会在 delete 操作符中被调用。对应的反射 API 方法为 Reflect.deleteProperty()。 返回值 de
getOwnPropertyDescriptor()
getOwnPropertyDescriptor() getOwnPropertyDescriptor()捕获器会在 Object.getOwnPropertyDescriptor()中被调用。对应的
defineProperty()
defineProperty() defineProperty()捕获器会在 Object.defineProperty()中调用。对应的反射 API 方法为 Reflect.defineProper
has()
has() has()捕获器会在 in 操作符中被调用。对应的反射 API 方法为 Reflect.has()。 返回值 has() 必须返回布尔值,表示属性是否存在。返回非布尔值会被转型为布尔值。
set()
set() set()捕获器 会在设置属性值的操作中被调用。对应的反射 API 方法为 Reflect.set()。 返回值 返回 true 表示成功;返回 false 表示失败,严格模式下会抛出 T
get()
get() get()捕获器会在获取属性值的操作中被调用。对应的反射 API 方法为 Reflect.get()。 返回值 返回值无限制。 拦截的操作 捕获器处理程序参数 target: 目标对象。
代理的问题与不足
代理的问题与不足 代理是在 ECMAScript 现有的基础上构建起来的一套新 API,因此其实现已经尽力做到最好了。很大程度上,代理作为对象的虚拟层可以正常使用,但在某些情况下,代理也不能实现与现在
代理另一个代理
代理另一个代理 代理可以拦截反射 API 的操作,而这意味着完全可以创建一个代理,通过它去代理另外一个代理。这样就可以在一个目标对象之上构建多层拦截网
实用反射 API
实用反射 API 某些情况下应该优先使用反射 API,这是有一些理由的。 反射 API 与对象 API 在使用反射 API 时,要记住: (1). 反射 API 并不限于捕获处理程序; (2). 大多
下一页