JS高级程序设计精简版(第九章:代理与反射)附思维导图

        时隔两年后二刷JavaScript高级程序语言,纯手打读书笔记+思维导图,让自己有一个比较全面的知识体系,后面有遇到例子的时候会慢慢补充更多的用法。有不足之处欢迎大家评论区指出,共勉!!

代理和反射可以拦截对目标对象的操作,必须通过操作代理才能实现拦截。代理是真实JS对象的透明抽象层。反射API封装了一整套与捕获器拦截的操作相对应的方法,

一、代理基础

  1. 创建一个代理

var proxy = Proxy(目标对象,处理程序对象)

给目标或代理的属性赋值,两个对象都会有反应,因为代理会将赋值转移到目标对象上。

但Proxy.prototype是undefined,所以不能对proxy使用instanceof操作符。

  1. 定义捕获器

捕获器:在处理程序对象中定义的“基本操作的拦截器”,拦截并修改对基本对象的操作。

// 捕获器在处理程序对象中以方法名为键

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中对参数进行验证

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值