什么时候要用到Reflect API?

参考文档
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] = valuereturn 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://xiahunao.cn/news/2814501.html

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

相关文章

没有货币化,郎酒也能用大营销让经销商赚到钱?

文|琥珀食酒社 作者 | 五画 一年卖一千亿,这是郎酒在去年9月8日定下的目标。 当时正值第三届郎酒庄园会员节之际,郎酒集团董事长汪俊林从使命、愿景、价值观等十二个方面发布“百年郎酒”总纲领。 为郎酒立下新的“351”工程发展目标&…

HarmonyOS—使用数据模型和连接器

Serverless低代码开发平台是一个可视化的平台, 打通了HarmonyOS云侧与端侧能力,能够轻松实现HMS Core、AGC Serverless能力调用。其中,数据模型和连接器是两大主要元素。开发者在使用DevEco Studio的低代码功能进行开发时,可以使用…

行为树入门:BehaviorTree.CPP Groot2练习(叶子节点)(2)

以《行为树BehaviorTree学习记录1_基本概念》练习。 1 SequenceNode顺序控制节点 代码下载 git clone https://gitee.com/Luweizhiyuan2020/ros2_bt.git例程 1.1 sequence 顺序执行 下载版本SequenceNode1。 1.2 ReactiveSequence 异步执行 注意: ①only a…

【算法 - 动态规划】找零钱问题Ⅰ

在前面的动态规划系列文章中,关于如何对递归进行分析的四种基本模型都介绍完了,再来回顾一下: 从左到右模型 :arr[index ...] 从 index 之前的不用考虑,只考虑后面的该如何选择 。范围尝试模型 :思考 [L ,…

架构设计:生产消费模型

1. 引言 在现代软件系统中,处理大量数据和消息是一项重要的任务。生产消费模型作为一种经典的并发模式,在解决数据生产和消费之间的关系上发挥着关键作用。该模型通过有效地管理生产者和消费者之间的通信和数据流动,实现了系统组件之间的解耦…

基于华为atlas的分类模型实战

分类模型选用基于imagenet训练的MobileNetV3模型,分类类别为1000类。 pytorch模型导出为onnx: 修改mobilenetv3.py中网络结构,模型选用MobileNetV3_Small模型,网络输出节点增加softmax层,将原始的return self.linear4…

k8s部署java微服务程序时,关于配置conusl acl token的方法总结

一、背景 java微服务程序使用consul作为服务注册中心,而consul集群本身的访问是需要acl token的,以增强服务调用的安全性。 本文试着总结下,有哪些方法可以配置consul acl token,便于你根据具体的情况选择。 个人认为&#xff…

【mysql 数据库事务】开启事务操作数据库,写入失败后,不回滚,会有问题么? 这里隐藏着大坑,复试,面试时可以镇住面试老师!!!!

建表字段: CREATE TABLE user (id INT(11) NOT NULL AUTO_INCREMENT,nickname VARCHAR(32) NOT NULL COLLATE utf8mb4_general_ci,email VARCHAR(32) NOT NULL COLLATE utf8mb4_general_ci,status SMALLINT(6) UNSIGNED NULL DEFAULT NULL,password VARCHAR(256) NULL DEFAULT…

IP源防攻击IPSG(IP Source Guard)

IP源防攻击IPSG(IP Source Guard)是一种基于二层接口的源IP地址过滤技术,它能够防止恶意主机伪造合法主机的IP地址来仿冒合法主机,还能确保非授权主机不能通过自己指定IP地址的方式来访问网络或攻击网络。 2.1 IPSG基本原理 绑定…

货运搬家小程序的功能与解决方案

在繁忙的现代生活中,搬家不再是一件简单的事。从物品的整理、打包到运输、卸载,每一个环节都可能让您感到头疼。而一款优秀的货运搬家APP,正是您解决这些搬家难题的得力助手。 那么货运搬家APP需要具备哪些功能呢? 1.注册与登录&…

IOC 和 AOP

IOC 所谓的IOC(inversion of control),就是控制反转的意思。何为控制反转? 在传统的程序设计中,应用程序代码通常控制着对象的创建和管理。例如,一个对象需要依赖其他对象,那么它会直接new出来…

气体反应瓶适用光伏光电半导体坚固耐用PFA缓冲瓶

PFA冲击瓶,别名特氟龙缓冲瓶、可溶性聚四氟乙烯气体反应瓶。用于气体、固体或液体间的反应实验,广泛应用于光电、新材料、新能源、半导体、地矿、冶金、核工业等行业。 PFA冲击瓶相对于其他材质的反应瓶,不易碎,使用更加安全&…

大模型推理常见采样策略:Top-k, Top-p, Temperature, Beam Search

在大模型训练好之后,如何对训练好的模型进行解码(decode)是一个重要问题。 大模型输出过程 大模型根据给定的输入文本(比如一个开头或一个问题)生成输出文本(比如一个答案或一个结尾)。为了生…

2024智慧城市革命:人工智能、场景与运营的融合之力

在数字革命的浪潮中,2024年的智慧城市将成为人类社会进步的新地标。 三大关键元素——人工智能、场景应用和精准运营——正在重新塑造城市面貌,构建未来的智慧城市生活图景。 一、人工智能:赋能智慧城市 随着人工智能技术的快速发展&#x…

【无标题】积鼎CFD VirtualFlow:航空及汽车燃油晃动流体仿真计算及试验对比

图1 汽车储液罐内的液体晃动 燃油晃动,作为航空、航海及汽车工业中一个重要的物理现象,一直以来都受到广泛关注。在飞行器、船舶或汽车的运行过程中,由于外部扰动或内部燃料的消耗,油箱内的燃油会产生晃动。这种晃动不仅会影响燃…

如何让线索经营更高效、有转化?(一)

​汽车主机厂和经销商从线索经营的:线索获取、线索清洗、线索转化3个环节入手,做精线索、做强转化。 本篇先介绍第一个环节-线索获取。 线索获取:一个平台管理多个投放平台,用更少成本拿到精准线索 一旦投放渠道变多&#xff0…

【Maven】Maven 基础教程(一):基础介绍、开发环境配置

Maven 基础教程(一):基础介绍、开发环境配置 1.Maven 是什么1.1 构建1.2 依赖 2.Maven 开发环境配置2.1 下载安装2.2 指定本地仓库2.3 配置阿里云提供的镜像仓库2.4 配置基础 JDK 版本2.5 配置环境变量 1.Maven 是什么 Maven 是 Apache 软件…

SpringMVC 学习(十)之异常处理

目录 1 异常处理介绍 2 通过 SimpleMappingExceptionResolver 实现 3 通过接口 HandlerExceptionResolver 实现 4 通过 ExceptionHandler 注解实现(推荐) 1 异常处理介绍 在 SpringMVC中,异常处理器(Exceptio…

港中文联合MIT提出超长上下文LongLoRA大模型微调算法

论文名称: LongLoRA: Efficient Fine-tuning of Long-Context Large Language Models 文章链接:https://arxiv.org/abs/2309.12307 代码仓库: https://github.com/dvlab-research/LongLoRA 现阶段,上下文窗口长度基本上成为了评估…

误删文件怎么恢复?别错过这3个实用方法!

“我在电脑里不小心将几个比较重要的文件误删了,误删的文件应该怎么恢复呢?大家有没有比较好用的恢复方法可以推荐一下呢?” 在日常生活和工作中,我们会将各种重要的文件保存在电脑上,如果在操作时我们误删了重要的文件…