Proxy和Reflect详解

之前一直没有理解proxy代理是啥意思,只是感觉很深奥的样子,最近正好在研究vue3的响应式原理,发现vue3是使用proxy完成响应式的,因此仔细的研究了一下proxy和reflect到底是啥

proxy是es6新增的一个新特性,可以通过代理对象完成对目标对象的拦截,并在拦截后进行骚操作

Proxy是通过实例化来生成的,入参有两个,第一个target是要拦截的目标对象,handler处理程序对象是对拦截后要完成的操作

let target = {foo: '谢小虫虫'
}
let handler ={//target目标对象//property属性名//生成的代理对象get(target,property,receiver){return target[property] + '虫虫飞'}
}
// proxy实现了对目标对象的拦截,并修改了返回数据
const proxy = new Proxy(target,handler)
console.log(target.foo)  // 谢小虫虫
console.log(proxy.foo)  // 谢小虫虫虫虫飞

使用代理的主要目的是为了定义捕获器,捕获器就是类似上述handler处理程序对象中的get,简单来说就是在handler中定义的基本操作的拦截器
捕获器一共13种,每种捕获器都有不同的参数和捕获不变式(捕获器必须遵守的一些行为)
apply 、construct、defineProperty、deleteProperty、get、getOwnPropertyDescriptor、getPrototypeOf、has、isExtensible
ownKeys、preventExtensions、set、setPrototypeOf

并非所有捕获器行为都像get那么简单,为了简化操作,我们可以直接调用全局Reflect,Reflect反射是在一个在全局中定义好的,包含了上述方法的对象,我们可以轻松通过同名方法重建

以上例子使用reflect后的效果,虽然在get中看不出什么效果,但用在较为复杂的捕获其上能简化很多

let target = {foo: '谢小虫虫'
}
let handler ={//target目标对象//property属性名//生成的代理对象get(target,property,receiver){return Reflect.get(...arguments)+ '虫虫飞'}
}
// proxy实现了对目标对象的拦截,并修改了返回数据
const proxy = new Proxy(target,handler)
console.log(target.foo)  // 谢小虫虫
console.log(proxy.foo)  // 谢小虫虫虫虫飞

甚至我们可以使用Reflect直接一次性设置代理中的所有捕获器

let target = {foo: '谢小虫虫'
}
const proxy = new Proxy(target,Reflect)

可撤销代理

某些情况下我们需要中断代理对象与目标对象之间的联系,我们可以使用Proxy的revocable()方法

let target = {foo: '谢小虫虫'
}
let handler ={get(target,property,receiver){return target[property] + '虫虫飞'}
}
//代理对象与撤销函数是在实例化的时候同时生成的
const {proxy,revoke} = Proxy.revocable(target,Reflect)
console.log(proxy.foo) // 谢小虫虫虫虫飞
revoke()
console.log(proxy.foo)  // TypeError

Proxy和Reflect详解相关推荐

  1. Proxy与Reflect详解

    前言 现在国内的两大框架:vue.react.对于这两个框架,相信大家多多少少都接触过,对于vue而言,有一个很重要的特点,那就是响应式.vue2的响应式采用的是ES5的Object.definepr ...

  2. 【Java】代理模式(Proxy模式)详解

    目录 1.代理模式 2.静态代理 2.1 通过继承实现静态代理 2.2 通过组合实现静态代理 3.动态代理 3.1 JDK动态代理 3.2 cglib动态代理 3.3 SpringAOP使用以及原理 ...

  3. JavaScript 反射机制及 Reflect 详解

    来自 | https://www.cnblogs.com/Leophen/archive/2021/06/02/14838608.html 一.什么是反射机制 反射机制是在编译阶段不知道是哪个类被加载 ...

  4. JS 反射机制及 Reflect 详解

    一.什么是反射机制 反射机制是在编译阶段不知道是哪个类被加载,而是在运行的时候才加载.执行. 也就是说,反射机制指的是程序在运行时能够获取自身的信息. js 中的 apply 就是反射机制. 二.Re ...

  5. Burp suite Proxy代理模块详解

    前言: 首先,我们要知道代理流程是整个web安全测试的基础,所以我们将第一个并且详细的演示他的功能. Proxy 代理模块处于浏览器和web服务器的中间 ,处理HTTP请求和响应就是两个基本功能,还有 ...

  6. 代理模式(Proxy模式)详解

    在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象.例如,购买火车票不一定要去火车站买,可以通过 12306 网站或者去火车票代售点买.又如 ...

  7. nginx配置详解,完全卸载nginx, nginx https配置

    nginx 配置文件详解 文章目录 nginx 配置文件详解 Ubuntu nginx 目录结构 nginx 配置文件结构 默认nginx.conf( (1.18.0版本) location详解,pr ...

  8. windows curl命令详解

    概述 Curl命令可以通过命令行的方式,执行Http请求.在Elasticsearch中有使用的场景,因此这里研究下如何在windows下执行curl命令. 软件下载 下载地址:https://cur ...

  9. Android 各大厂面试题汇总与详解(持续更新)

    介绍 目前网络中出现了好多各种面试题的汇总,有真实的也有虚假的,所以今年我将会汇总各大公司面试比较常见的问题,逐一进行解答.会一直集成,也会收集大家提供的面试题,如有错误,请大家指出,经过排查存在,会 ...

最新文章

  1. linux sql server客户端,Linux的MS SQL Server客户端SQuirrel SQL Client
  2. sql中如何统计各种零件的总数量_[Python]提取数据库中数据, 用人货场的分析方法, 对电商双十一促销活动结果数据进行复盘分析...
  3. python算法与数据结构-循环链表(41)
  4. BZOJ-1968: [Ahoi2005]COMMON 约数研究 (思想)
  5. OpenCV学习:仿射变换+投射变换+单应性矩阵
  6. js字符串replace替换多个_汇总几大python常见字符串处理函数与用法(建议收藏)...
  7. Linux substring if
  8. 阶段2 JavaWeb+黑马旅游网_15-Maven基础_第1节 基本概念_02maven依赖管理的概念
  9. 记录一次rpc 漏洞补丁查看
  10. 【老生谈算法】matlab实现Dijkstra最短路算法源码——Dijkstra算法
  11. 天池大数据竞赛-河北高校邀请赛——二手车交易价格预测-初赛第22名
  12. BUPT Summer Journey #test11 A
  13. ballerina 学习 三十一 扩展开发(二)
  14. 1个免费网站教你如何追踪微信实时热点,速速收藏
  15. AutoCAD各版本对应的R版本参数值及其对应注册表中的数值(2002-2023)
  16. Penny Pinching在云中:Azure网站何时有意义?
  17. cocos2dx 背包界面的实现
  18. 真实创业故事:我在15平的出租房里死磕项目!
  19. 中国科学技术大学2021计算机考研分数线,中国科学技术大学2021考研分数线
  20. centos7安装或升级Firefox、安装Google chrome浏览器详细过程及设置桌面快捷方式

热门文章

  1. scss 基本语法整理
  2. html padding顺序,html中padding用法
  3. cy7c68013 usb 开发经验
  4. sql实现查询学习了所有课程的学生信息
  5. c语言中的void类型解析
  6. 有限元方法基础-以二维拉普拉斯方程为例(附程序)
  7. 【论文Word排版】使用多级列表设置论文序号
  8. 5G网络巨大耗电量和基站密度,注定5G服务价格昂贵
  9. Mybatis 中文技术文档
  10. 干货 |如何优雅的在手机上进行Python编程