vue2源码重写数组方法学习

在学习之前,我们需要问一个为什么,为什么vue2 源码要重写数组方法

  • 响应式数据更新:通过重写数组方法,Vue 能够捕获对数组的变更操作(如 push、pop、shift 等),并在数据发生变化时自动更新视图,实现了数据的响应式更新。

  • 侦测变更:重写数组方法使 Vue 能够侦测到数组的变更,从而触发相应的更新。这样,当修改了数组的内容时,视图能够及时地做出相应的变化。

  • 便捷的操作语法:通过重写数组方法,Vue 使开发者能够直接对数组进行操作而无需手动触发视图更新,提供了一种更加便捷的操作语法。

  • 保持一致性:通过统一对数组方法的处理,Vue 2.x 在处理数组变更时能够保持代码的一致性和可维护性。

总的来说,重写数组方法使得 Vue 能够更好地支持响应式数据更新,提供了更加便捷和灵活的数据操作方式,从而使得开发者能够更加轻松地管理和操作数据,同时保持了视图和数据的一致性。

// 保存数组原型方法的引用
const arrayProto = Array.prototype;
// 创建一个新的对象,继承自数组原型
const arrayMethods = Object.create(arrayProto);// 重写数组的变异方法
['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'].forEach(function (method) {// 缓存原始数组方法const original = arrayProto[method];// 重新定义数组方法def(arrayMethods, method, function mutator(...args) {// 调用原始数组方法const result = original.apply(this, args);const ob = this.__ob__;let inserted;// 处理新增元素switch (method) {case 'push':case 'unshift':inserted = args;break;case 'splice':inserted = args.slice(2);break;}if (inserted) ob.observeArray(inserted);// 触发更新ob.dep.notify();return result;});
});// 重写之后的数组方法挂载到数组的原型上
function def(obj, key, val, enumerable) {Object.defineProperty(obj, key, {value: val,enumerable: !!enumerable,writable: true,configurable: true});
}// 最后,将重写后的数组方法挂载到数组原型上
def(arrayProto, '$set', function $set(index, val) {// ... $set 方法的具体实现
}, false);def(arrayProto, '$delete', function $delete(index) {// ... $delete 方法的具体实现
}, false);export { arrayMethods };

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

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

相关文章

Facebook代运营 | Facebook广告投放步骤及要点

Facebook体量大,素材的更新频率快,通过Facebook进行广告投放的用户也越来越多,Facebook坐拥大量用户,同时有着非常科学的用户画像构建系统和推送机制,对于很多广告涉足的伙伴来说,更加的友好。 1. 创建广告…

Opentracing 代码Demo

背景 OpenTracing 是一个提供标准化分布式追踪功能的API和工具。它的主要作用包括: 跨系统边界追踪请求流程:OpenTracing 允许开发者跟踪一个请求从开始到结束在整个分布式系统中的所有经过的点(包括异构系统),帮助理解系统中的请求流程和服务间的相互依赖。 性能分析和瓶…

ubuntu系统 kubeadm方式搭建k8s集群

服务器环境与要求: 三台服务器 k8s-master01 192.168.26.130 操作系统: Ubuntu20.04 k8s-woker01 192.168.26.140 操作系统: Ubuntu20.04 k8s-woker02 192.168.26.150 操作系统: Ubuntu20.04 最低配置:2…

斯坦福 AI 团队被曝抄袭中国大模型开源成果;Zoom 创始人谈视频会议未来丨 RTE 开发者日报 Vol.218

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

gradio出现httpcore.ReadTimeout: timed out问题

解决办法 pip install https://gradio-builds.s3.amazonaws.com/aae46d9199e1edc8a22c96aba1ade12f6ebc1da1/gradio-4.21.0-py3-none-any.whl

2.29G大小Win 11系统来了,老爷机也能焕发第二春

Win 11 推出近三年以来微软大搞特搞的份额入侵计划,以目前情况来看算是彻底失败了。 国外知名机构 statcounter 最近公布了 4 月份 Windows 各版本份额调查结果。 其中显示,Win 11 占比 26% 左右,相较 2 月份 28% 反而开起了倒滑车。 来源&…

技术管理革新:三品PLM在电子电气行业的应用

随着科技的不断进步和市场需求的日益增长,电子电气行业正经历着前所未有的变革。产品生命周期的缩短和更新换代的加速,对企业的产品研发管理提出了更高的要求。在这样的背景下,产品生命周期管理PLM解决方案应运而生,旨在帮助电子电…

Python工程中,__init__.py文件有什么用

在Python工程中,__init__.py 文件有几个重要的用途: 标识目录为包: 在Python 3.3之前,__init__.py 文件的存在是为了告诉解释器,该目录是一个Python包。这使得包中的模块可以被导入和使用。即使在Python 3.3之后可以没…

隔离变压器的特点与作用

隔离变压器是一种常见的电力变压器,其主要特点和作用如下: 特点: 电气隔离: 隔离变压器的主要特点是将输入端和输出端完全电气隔离,通过磁耦合实现能量传递。这意味着输入端和输出端之间没有直接的电连接&#xff0c…

endswith方法 测试字符串是否以指定的后缀结束

Java String类中的endswith方法 Java String类 endsWith () 方法用于测试字符串是否以指定的后缀结束。 语法 public boolean endsWith (String suffix) 参数 suffix -- 指定的后缀。 返回值 如果参数表示的字符序列是此对象表示的字符序列的后缀,则返回 true&…

基于数据帧进行SQL查询

本教程将通过一个具体的案例来演示如何在Spark SQL中基于数据帧进行SQL查询。我们将从创建临时视图开始,然后使用spark对象执行SQL查询,包括投影、选择、统计和排序等操作。 具体步骤如下: 基于数据帧创建临时视图: 命令格式&…

深度学习笔记:1.anaconda安装

Download Anaconda Distribution | Anaconda 双击安装 设置环境变量 anaconda常用命令大全(保姆级别建议收藏)-CSDN博客https://blog.csdn.net/m0_64892604/article/details/128806043?ops_request_misc%257B%2522request%255Fid%2522%253A%252217174671831680018…

This Python interpreter is in a conda environment

今天在查看python版本的时候出现警告 Warning: This Python interpreter is in a conda environment, but the environment has not been activated. Libraries may fail to load. To activate this environment please see https://conda.io/activation 这个警告意味着你…

MySql学习(二)——SQL通用语法之DDL

文章目录 二、SQL2.1 SQL通用语法2.2 SQL分类2.3 DDL2.3.1 DDL——数据库操作2.3.2 DDL——表操作-查询2.3.3 DDL——表操作-创建2.3.4 DDL——表操作-数据类型2.3.5 DDL——表操作-修改2.3.6 DDL——表操作-删除二、SQL 2.1 SQL通用语法 SQL语句可以单行或多行书写,以分号结…

2024年6月4日13:48:07-3.8功能说明1.保存草稿2.支持自定义SKU销售规格3.全网爆款企划支持一键提交

创建产品产品保存草稿、自定义编辑规格功能使用手册 尊敬的淘工厂商家: 淘工厂近两个月收到很多商家对淘工厂发品(上品)效率提升的改进建议,淘工厂本月将针对产品发布页的发品效率提升上线一系列改进功能,希望能加速…

c#快速获取超大文件夹文件名

c#快速获取超大文件夹文件名 枚举集合速度快&#xff1a;(10万个文件) //by txwtech IEnumerable<string> files2 Directory.EnumerateFiles("d:\aa", "*.xml", SearchOption.TopDirectoryOnly);//过滤指定查询xml文件 慢&#xff1a; var fi…

设计循环队列---力扣622

1、题目 1.1基础设置与讲解 循环队列&#xff0c;即固定长度的队列&#xff0c;可以想象成一个环形队列 就类似于这种队列&#xff0c;队尾指针后会有一个空位&#xff0c;用于控制判断队列为空还是为满&#xff1b; typedef int MyDataType;typedef struct {MyDataType fron…

CTF-Misc学习笔记

这里写目录标题 Misc准备古典密码凯撒密码棋盘密码ADFGX密码培根密码栅栏密码摩斯密码猪圈密码键盘密码QWE编码ook编码BrainFUck密码aaencode密码jsfuckbase全家桶URL编码十六进制二进制 ascii码 2.图片隐写分析LSP 隐写实操图片修改宽高实操 零宽度字符隐写音频隐写分析与实操…

新项目来了,JDK 17和JDK 21 该如何选择?

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

mysql语句,建表,修改表,删除表数据,修改表数据,添加外键

删除表结构 DROP TABLE IF EXISTS 表名;删除表数据 delete from 表名 where 条件;修改表数据 UPDATE students SET 字段 值 WHERE 条件;修改一个字段的类型 ALTER TABLE 表名 MODIFY 字段名 字段类型 DEFAULT NULL COMMENT 字段注释;新增字段 ALTER TABLE 表名 ADD COLU…