前端必备基础系列(八)Proxy/Reflect/Map/WeakMap

news/2025/1/13 9:58:54/文章来源:https://www.cnblogs.com/codeyx/p/18656407

1.解释JavaScript中的Proxy对象是什么以及它是如何工作的,用于哪些场景?

  • Proxy 是ES6引入的一种新特性,允许我们创建一个代理对象来拦截并定制对另一个对象的基本操作。比如获取、设置、删除数据等。
  • Proxy 通过一个构造函数创建,接受两个参数:
    target:希望代理的目标对象
    handler:一个对象,里面包含了一些“捕捉器”(traps),这些捕捉器定义了我们希望拦截的操作,以及我们想要如何处理这些操作。
  • 当对代理对象操作时,这些操作会被代理捕捉器拦截,并根据捕捉器的定义进行处理。
  • Proxy 的应用场景非常广泛,举两个例子:
    Vue3中的响应式系统:
    * Vue3源码中,为了做到监听对象的响应式,必须监听对象的改变,根据改变更新DOM;
    * 在Vue2中使用的是Object.defineProperty,但它设计的并不是为了监听对象属性;
    * 所以在Vue3中对于对象的监听使用Proxy代理对象;
  • 封装event-store:
    可在多个页面、组件共享;
    使用Proxy代理监听传入的对象,当数据发生改变时,可通知页面或者组件数据的改变;
    其他页面、组件根据数据改变做出响应,比如更新页面、网络请求等;
    总之,它提供了对 对象的操作进行拦截和定制的能力。

2.比较Proxy和Object.defineProperty之间的区别?
它们的设计目的是不一样的:
* Object.defineProperty 在设计时并不是为了做数据监听的,它的设计目的主要是为了提供对 对象属性的精细控制;
* Object.defineProperty 允许我们详细的定义或修改对象的属性描述符,包括属性的可写性(writable)、可枚举性(enumerable)、可配置性(configurable)等。通过这些描述符,我们可以对对象的属性行为进行更细粒度的控制;
* 而Proxy设计的目的就是为了帮助我们可以代理某一个对象,并监听、拦截对象的操作;
在功能上来说,确实都可以实现监听的功能:
* Object.defineProperty是ES5引入的,它可以通过设置getter和setter方法来拦截和自定义属性的访问和修改行为。但它仅限于对单个属性拦截,无法作用于整个对象。
* 另外它可以拦截的功能是有限的,不能拦截属性的删除、新增、遍历等操作。
* Proxy是ES6引入的,可以用于创建一个代理对象,全面拦截对另一个对象的操作。
* Proxy提供了多种捕捉器(如get、set、has、deleteProperty),这些捕捉器覆盖了几乎所有对象操作。
在性能方面,不同场景优势是不同的:
* 由于Object.defineProperty直接操作对象的属性并且不需要引入额外的中间对象,在单一属性的操作时通常性能更好
* Proxy由于引入了代理层,会在每次操作时触发捕捉器,这会带来一定的性能开销。
* 但Proxy的灵活性和全面性在很多情况下可以弥补性能上的损耗,尤其在需要全局监听对象行为的场景中。
应用场景:
* Object.defineProperty适用于只拦截和修改某个或者某几个属性的场景。不需要代理整个对象。兼容性更好支持ES5及以上
* Proxy适用于需要拦截和定制对象几乎所有操作的场景
* 总之,Object.defineProperty适用于简单、局部的属性控制,性能相对较好,兼容性更强。Proxy提供了更为强大的对象操作拦截能力。

3.Map和WeakMap有什么不同?

  • Map是一种键值对集合,可以使用任何类型的值作为键。

  • 它的键是强引用的,意味着只要在Map中存在对某个对象的引用,那么这个对象就不会被垃圾回收。

  • 只要这个对象是Map的键,即使不再使用它,就不会被回收,可能导致内存泄露。

  • Map可迭代,可通过for...of遍历。

  • WeakMap也是一种键值对集合,但它的键必须是对象,不能是基本类型。

  • WeakMap中的键是弱引用的,如果某个对象只是WeakMap的键,并没有其他强引用,它就会被垃圾回收机制回收。

  • 这使得WeakMap非常适合存储那些临时对象。

  • WeakMap不可迭代,无法通过for...of或者其他方式遍历。
    Vue中使用WeakMap作为组件属性对象的键,当组件销毁时,组件的属性对象自动销毁。

4.Reflect是什么?

  • Reflect是ES6新增的API,它是一个对象,字面的意思是反射。
  • 它主要提供了很多操作JavaScript对象的方法,有点像Object中操作对象的方法。
  • 比如Reflect.getPrototypeOf(target) 类似于 Object.getPrototypeOf()
  • 比如Reflect.defineProperty(target, propertyKey, attributes) 类似于 Object.defineProperty()
    既然Object中就有这些方法,为什么还要用到Reflect?
  • 因为早期ECMA规范中没有考虑到如何对对象本身的操作更规范,所以将这些API放到了Object上。
  • 但Object作为一个构造函数,将这些操作放到它身上并不合适。
  • 另外还包含一些类似in、 delete操作符,让JS看起来很奇怪。
  • 所以在ES6中新增了Reflect,把这些操作集中在这上面。
  • 另外在使用Proxy时,可以做到不直接操作原对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/868605.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s volcano + deepspeed多机训练 + RDMA ROCE+ 用户权限安全方案

前提:nvidia、cuda、nvidia-fabricmanager等相关的组件已经在宿主机正确安装,如果没有安装可以参考我之前发的文章GPU A800 A100系列NVIDIA环境和PyTorch2.0基础环境配置【建议收藏】_a800多卡运行环境配置-CSDN博客文章浏览阅读1.1k次,点赞8次,收藏16次。Ant系列GPU支持 N…

飞驰云联荣获中国信通院2024年度首期“磐安”优秀案例

2024年12月24日,中国信息通信研究院(以下简称“信通院”)在京成功举办“2025中国信息通信院ICT深度观察报告会”,会上隆重发布了由信通院数字安全护航计划组织的2024年度首期“磐安”优秀案例评选结果,Ftrans飞驰云联凭借卓越的技术创新和案例应用价值,成功入选金融领域优…

Mysql身份认证过程

背景 最近有一些hersql的用户希望能支持mysql的caching_sha2_password认证方式,caching_sha2_password与常用的mysql_native_password认证过程差异还是比较大的,因此抽空研究了一下caching_sha2_password身份认证过程,并为hersql支持了caching_sha2_password的能力hersql是我…

Cloudflare Pages 搭建 DockerHub 镜像加速器

登录https://dash.cloudflare.com/ 进入Workers创建一个Worker名称随意,然后点击部署编辑代码访问https://github.com/cmliu/CF-Workers-docker.io/blob/main/_worker.js 复制代码将代码全部替换点部署刷新预览后显示搜索框部署成功 点返回,然后选择设置,点添加自定义域名填…

开箱即用!一款支持多个大语言模型服务的桌面客户端!

Cherry Studio —— 一款支持多个大语言模型(LLM)服务的桌面客户端,兼容 Windows、Mac 和 Linux 系统。大家好,我是 Java陈序员。 可以说现在 AI 给我们的生活、工作带来了极大的便利,各种大语言模型层出不穷,功能多样。 今天,给大家介绍一款支持多模型服务的桌面客户端…

N皇后问题

题目 n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上,并且使皇后彼此之间不能相互攻击(每一行,每一列,每个对角线上只能有一个皇后存在)。 给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。 示例 1:输入:n = 4 输出:2 解释:如上图所示,4 皇后问题…

掌握设计模式--代理模式

代理模式(Proxy Pattern) 代理模式(Proxy Pattern)是一种结构型设计模式,允许你通过代理对象来控制对其他对象的访问。代理模式的主要目的是通过代理对象来控制原对象的访问、延迟加载、权限控制等。 组成结构Subject(主题接口):定义了真实对象和代理对象的共同接口。 …

前端实现 HTML 网页转 PDF 并导出

有个新需求,当点击【下载】按钮时,直接将当前 html页面下载为 PDF。通过 html2canvas + jsPDF 可实现PDF单页下载,甚至是多页下载,记录分享一下~ 最后有样式源码,可自取🫡有个新需求,当点击【下载】按钮时,直接将当前 html页面下载为 PDF。通过 html2canvas + jsPDF 可…

AI应用实战课学习总结(5)回归分析预测实战

本文介绍了机器学习中的起点:回归分析,并进行了一个电商用户生命周期价值(LTV)的分析预测实战,最后还进行了多种回归模型的拟合效果对比,相信你会有一个直观的印象。大家好,我是Edison。 最近入坑黄佳老师的《AI应用实战课》,记录下我的学习之旅,也算是总结回顾。 今天…

Gitlab Runner安装与配置

由于格式和图片解析问题,为了更好阅读体验可前往 阅读原文本篇使用Docker安装Gitlab runner进行runner的安装和注册,其他方式请参考官方文档非Docker安装Gitlab runner请确保runner版本和gitlab版本兼容以及docker相关版本兼容问题下载镜像 docker pull gitlab/gitlab-runner…

笔记本电脑清灰以及升级硬盘与内存

1、工具准备(1)螺丝刀:最好使用手柄较粗(容易发力)、有磁吸(螺丝不易掉)、以及批头可以替换的螺丝刀。(2)撬片:拆机常用的是三角撬片,越薄越好;没有的话也可以用废弃的银行卡替代。(3)磁吸定位板:用于存放螺丝,没有的话也可以用瓶盖替代。(4)气吹与毛刷:用于…

读量子霸权02数字时代的终结

2000年前希腊人创造的安提基西拉仪器是计算机雏形,可计算月球运转。安提基西拉代表古代模拟宇宙巅峰。巴比奇未实现最先进机械计算机梦想。图灵被誉为“计算机科学之父”,提出图灵机概念。数字计算机比模拟计算机准确。图灵测试提出机器能否像人思考。1. 爱琴海的海底 1.1. 2…