什么时候要用到Reflect API?

news2025/2/27 8:10:05

参考文档
https://www.zhihu.com/question/460133198
https://cn.vuejs.org/guide/extras/reactivity-in-depth.html
https://juejin.cn/post/7103764386220769311

Reflect API 一般搭配 Proxy API 一起使用。什么是 Proxy API 呢?
先回顾下 vue 的数据响应性是如何实现的。

Vue2 用逐个属性 Object.defineProperty()改 get 和 set 方法来实现,对于某些情况数据绑定不生效,要强制刷新。比如直接改变数组下标(defineProperty能监听,但因性能问题放弃。数组部分 api 比如 push 通过重写实现监听);无法监听属性的增加和删除。层级深时还会有性能问题。

到了 Vue3 改为用 Proxy、 Reflect API 实现。相比defineProperty不需要遍历所有属性要改写 get 和 set 方法,提高效率。

let validator = {
 set: function (obj, prop, value, receiver) {
   return Reflect.set(obj, prop, value, receiver)
 },
};

let person = new Proxy({}, validator);

对于 Vue2 之前的问题也能解决:

  1. 无法监听删除属性
  2. 无法监听新增属性,直接改变数组下标

看到上面的代码,你会好奇,为啥 set 要用 Reflect.set,不直接object[prop]=value? 还要最后的 receiver 参数有什么用?

看文档,receiver 是 this 的指向,如果我们直接object[prop]=value,会有什么问题呢?

const a = {
	firstName:'Z', 
	secondName: 1, 
	get name () {
		return this.firstName+this.secondName
	}
}
const proxy = new Proxy(a, {
	get(obj, prop, receiver) {
		return obj[prop]
	},
	set(obj, prop,value) {
		obj[prop] = value
		return true
	}
})
const b = {
	secondName:2
}
Object.setPrototypeOf(b, proxy);
console.log(b.name) // Z1
const a = {
	firstName:'Z', 
	secondName: 1, 
	get name () {
		return this.firstName+this.secondName
	}
}
const proxy = new Proxy(a, {
	get(obj, prop, receiver) {
		return Reflect.get(obj, prop, receiver)
	},
	set(obj, prop,value ,receiver) {
		return Reflect.set(obj, prop,value, receiver)
	}
})
const b = {
	secondName:2
}
Object.setPrototypeOf(b, proxy);
console.log(b.name) // Z2

文档里说 receiver是调用时 this 的指向,第一个参数 target 是目标对象,在上面的例子里,因为 b 没有 name 属性,所以沿着原型链去找,在 a 找到了,此时 get 方法里,obj 就是 a,recevier 仍是 b,我们按照预期应该是用 b 的 secondName 才对。
同时,b 是没有 firstName 的,看结果最后也从 a 里取到 firstName 的值了。

Reflect API 除了能保证 this 的指向正确,还帮助我们在进行 Proxy 编程时代码更清晰。
这里只是 get 和 set 的例子, 可以直接return obj[prop]或者obj[prop]=value,但 Proxy 还有很多其他的 API,如果这些 API都 要重新实现一次原本的行为比较麻烦,也不清晰。直接调用 Reflect.xxx这样就方便很多。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

27-树-左叶子之和

这是树的第27篇算法,力扣链接。 给定二叉树的根节点 root ,返回所有左叶子之和。 示例 1: 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 2…

前后端项目宝塔linux部署(springboot,vue,python)

宝塔linux安装就省略了,网上一堆 1.部署后端 1.首先把自己项目里面打包好的的jar包上传到服务器随便一个地方,我这里就上传到www/wwwroot下面了,宝塔的文件页面可以很便携上传 2.然后到下面这个页面 选那个java环境管理装个jdk&#xff…

在github的README.md中插入视频;在github的README.md中添加gif演示动画

最近需要再github中上传项目的源代码,应导师的要求,需要再README中加入对实验视频的展示,但是github的README.md其实就是一个markdown文件,据我的理解这个文件里应该无法直接插入视频吧?(如果后续有办法直接…

【postgresql】数据表id自增与python sqlachemy结合实例

需求: postgresql实现一个建表语句,表名:student,字段id,name,age, 要求:每次添加一个数据id会自动增加1 在PostgreSQL中,您可以使用SERIAL或BIGSERIAL数据类型来自动生成主键ID。以下是一个创建名为stude…

2024环境,资源与绿色能源国际会议(ICERGE2024)

2024环境,资源与绿色能源国际会议(ICERGE2024) 一、【会议简介】 2024环境、资源与绿色能源国际会议(ICERGE2024)将于2024年在三亚举行。该会议是一个围绕环境、资源与绿色能源研究领域的国际学术交流活动。 会议主题包括但不限于环境科学、环境工程、资源利用、绿…

C++之类和对象(2)

目录 1.类的6个默认成员函数 2. 构造函数 2.1 概念 2.2 特性 3.析构函数 3.1 概念 3.2 特性 4. 拷贝构造函数 4.1 概念 4.2 特征 5.赋值运算符重载 5.1 运算符重载 5.2 赋值运算符重载 2. 赋值运算符只能重载成类的成员函数不能重载成全局函数 3. 用户没有显式实现时&…

pycharm如何安装pygame库

pycharm如何安装pygame库 PyCharm是Python中广受欢迎的一种IDE,它可以为用户提供许多工具和便利的服务,从而大大提高开发效率。pygame库可以用python进行游戏开发提供很好的支持,那么在ptcharm中如何安装pygame库呢? 一、安装步…

Sora背后的技术原理解析(简单易懂版本)

本篇文章是OpenAI发布的最强AI视频生成工具Sora技术详解(非官方),然而,Sora的野心远不止是视频生成,而是作为一个世界模型。之前的文章中已经介绍了很多关于文生图的相关技术,相信有了文生图的基础后再来学…

[c/c++] static 关键字

从修饰的对象来看,static 可以修饰局部变量,也可以修饰全局变量,可以修饰函数;可以修饰类中的成员变量以及成员函数。 从生命周期的角度来看,static 修饰的对象的生命周期,与进程的生命周期是一致的。 从…

大话设计模式——3.建造者模式(Builder Pattern)

1.定义: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。UML图 2.示例: 汽车或者电脑的组装可以采用构造者模式进行设计,如汽车的引擎或者轮胎,电脑的处理器、内存、主板等都可以进行…

【Java设计模式】四、适配器模式

文章目录 1、适配器模式2、举例 1、适配器模式 适配器模式Adapter Pattern,是做为两个不兼容的接口之间的桥梁目的是将一个类的接口转换成客户希望的另外一个接口适配器模式可以使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 最后,适配器…

【51单片机】红外遥控红外遥控电机调速(江科大)

1.红外遥控简介 红外遥控是利用红外光进行通信的设备,由红外LED将调制后的信号发出,由专用的红外接收头进行解调输出 通信方式:单工,异步 红外LED波长:940nm 通信协议标准:NEC标准 2.硬件电路 红外发送部分 IN高电平时,LED不亮,IN低电平时&…

Langchain-Chatchat:离线运行的大模型知识库 | 开源日报 No.182

chatchat-space/Langchain-Chatchat Stars: 22k License: Apache-2.0 基于 ChatGLM 等大语言模型与 Langchain 等应用框架实现的开源、可离线部署的检索增强生成 (RAG) 大模型知识库项目。该项目是一个可以实现完全本地化推理的知识库增强方案,重点解决数据安全保护…

【C语言】linux内核netdev_start_xmit函数

一、中文注释 static inline netdev_tx_t netdev_start_xmit(struct sk_buff *skb, struct net_device *dev, struct netdev_queue *txq, bool more) {// 获取网络设备操作集合const struct net_device_ops *ops dev->netdev_ops;int rc;// 调用实际发送数据包的函数&…

RCS-YOLO:检测头和网络结构的改进

目录 摘要 原理 总体结构图 RCS模块原理 代码实现 RCS-Based One-Shot Aggregation 代码实现 检测头改进 手动计算anchor代码 yaml文件 已详细修改的代码 程序启动命令 可论文指导 V ------------> jiabei-545 往期推荐 摘要 凭借速度和准确性之间的出色平…

学习笔记-李沐动手学深度学习(七)(19-21,卷积层、填充padding、步幅stride、多输入多输出通道)

总结 19-卷积层 【补充】看评论区建议的卷积动画视频 数学中的卷积 【链接】https://www.bilibili.com/video/BV1VV411478E/?fromsearch&seid1725700777641154181&vd_sourcee81e116c4ffe5e79d4bc44738263eda4 【可判断是否为卷积的典型标志】两个函数中自变量相加…

瑞_Redis_Redis客户端

文章目录 1 Redis客户端1.1 Redis命令行客户端1.2 图形化桌面客户端1.2.1 资源准备1.2.2 安装1.2.3 建立连接 🙊 前言:本文章为瑞_系列专栏之《Redis》的基础篇的Redis客户端章节。由于博主是从B站黑马程序员的《Redis》学习其相关知识,所以本…

导轨安装式称重传感器信号变送器差分信号隔离转换0-10mV/0-20mV/0-±10mV/0-±20mV转0-5V/0-10V/4-20mA

主要特性 DIN11 IPO 压力应变桥信号处理系列隔离放大器是一种将差分输入信号隔离放大、转换成按比例输出的直流信号导轨安装变送模块。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等行业。此系列模块内部嵌入了一个高效微功率的电源,向输入端和输…

图像处理ASIC设计方法 笔记4 异步FIFO

P66 异步FIFO 这段对FIFO的描述很精彩: 理解了水位信号的含义(相当于通常所说的满/空标志,注意读时钟域的空信号,写时钟域的满信号,只能在它各自的时钟域直接使用,如果要在另一时钟域用,需要使…

顺丰科技2024届春季校园招聘常见问题解答及SHL测评题库

顺丰科技2024届春季校园招聘常见问题解答及SHL测评题库 Q:顺丰科技2024届校园招聘面向对象是? A:2024届应届毕业生,毕业时间段为2023年10月1日至2024年9月30日(不满足以上毕业时间的同学可以关注顺丰科技社会招聘或…