Vue响应式原理实现总结(数据劫持Object.defineProperty/Proxy+发布订阅者设计模式)

Vue的响应式主要分为数据劫持和发布订阅模式。Vue2用的是Object.defineProperty,而Vue3改用Proxy。数据劫持就是在访问或修改对象属性时进行拦截,然后触发相应的更新。发布订阅模式则是用来收集依赖(比如视图更新函数),当数据变化时通知这些依赖执行。
总结一下,关键点包括:

  1. 使用Object.defineProperty或Proxy进行数据劫持
  2. 在getter中收集依赖(Watcher到Dep)
  3. 在setter中触发Dep的通知,执行所有Watcher的更新
  4. 发布订阅模式通过Dep和Watcher实现依赖管理

在这里插入图片描述
在这里插入图片描述

相关知识

数据劫持实现

以下是关于 Object.defineProperty()Proxy 的详细介绍和对比:


一、Object.defineProperty()

1. 核心功能

  • 定义:JavaScript 原生方法,用于直接在对象上定义新属性,或修改现有属性。
  • 核心能力:通过 gettersetter 拦截属性的读写操作
  • 兼容性:ES5+,支持所有现代浏览器及 IE9+。

2. 基本语法

Object.defineProperty(obj, prop, {get() { /* 读取属性时触发 */ },set(newVal) { /* 修改属性时触发 */ },enumerable: true, // 可枚举configurable: true // 可配置(如删除)
});

3. 典型用途

const data = { count: 0 };// 劫持属性
Object.defineProperty(data, "count", {get() {console.log("读取 count");return this._count; // 使用临时变量存储值},set(newVal) {console.log("修改 count");this._count = newVal;}
});data.count = 1; // 输出 "修改 count"
console.log(data.count); // 输出 "读取 count" → 1

4. 局限性

场景问题描述
新增属性无法劫持未预先定义的属性
数组索引修改直接通过索引修改元素无法触发监听
数组方法(push等)需重写数组方法才能劫持
深层对象需递归遍历所有属性,性能较差

二、Proxy

1. 核心功能

  • 定义:ES6 新增的元编程特性,用于创建一个对象的代理,拦截并自定义对象的基本操作。
  • 核心能力:拦截 13 种对象操作(如读写属性、删除属性、方法调用等)。
  • 兼容性:ES6+,不支持 IE11 及更低版本。

2. 基本语法

const proxy = new Proxy(target, {get(target, prop) { /* 拦截属性读取 */ },set(target, prop, value) { /* 拦截属性修改 */ },// 其他拦截器:deleteProperty、has、ownKeys 等
});

3. 典型用途

const data = { count: 0 };const proxy = new Proxy(data, {get(target, prop) {console.log(`读取 ${prop}`);return Reflect.get(target, prop);},set(target, prop, value) {console.log(`修改 ${prop}${value}`);return Reflect.set(target, prop, value);}
});proxy.co

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

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

相关文章

Opencv项目实战:26 信用卡号码识别与类型判定

项目介绍 在日常生活中,信用卡的使用越来越普遍。本项目的主要目标是通过图像处理技术自动识别信用卡号码,并根据信用卡号码的第一个数字判定信用卡的类型(如Visa、MasterCard等)。项目结合了图像预处理、轮廓检测、模板匹配等技…

伯克利 CS61A 课堂笔记 10 —— Trees

本系列为加州伯克利大学著名 Python 基础课程 CS61A 的课堂笔记整理,全英文内容,文末附词汇解释。 目录 01 Trees 树 Ⅰ Tree Abstraction Ⅱ Implementing the Tree Abstraction 02 Tree Processing 建树过程 Ⅰ Fibonacci tree Ⅱ Tree Process…

STL —— 洛谷字符串(string库)入门题(蓝桥杯题目训练)(一)

目录 一、B2109 统计数字字符个数 - 洛谷 算法代码: 1. 引入库和命名空间 2. 主函数 3. 读取输入 4. 变量初始化 5. 遍历字符串 6. 输出结果 7. 返回值 总结 评测记录: 二、B2110 找第一个只出现一次的字符 - 洛谷 方法一:算法代…

【数据分析】1 认识数据分析

一、课程核心内容结构 1. 课程定位 商业数据分析导论课:旨在为初学者奠定扎实的基础,介绍数据分析的基本概念、方法和应用场景。后续模块:包括职业发展路径、技能要求等深入内容,帮助学习者规划未来的职业道路。目标群体&#x…

【Prometheus】prometheus结合domain_exporter实现域名监控

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

【分果果——DP(困难)】

题目 分析 分果果题解参考,下面是补充https://blog.csdn.net/AC__dream/article/details/129431299 关于状态 设f[i][j][k]表示第i个人取到的最后一个糖果编号是j,第i-1个人取到的最后一个糖果编号小于等于k时的最大重量的最小值 关于转移方程 关于 j …

大白话实战Sentinel

Sentinel是SpringCloudAlibaba提供的用来做服务保护的框架,而服务保护的常见手段就是限流和熔断降级。在大型分布式系统里面,由于微服务众多,所以服务之间的稳定性需要做特别关注,Sentinel的核心包就提供了从多个维度去保护服务稳定的策略,而且这些保护策略都可以连接上Se…

解锁机器学习核心算法 | 支持向量机:机器学习中的分类利刃

一、引言 在机器学习的庞大算法体系中,有十种算法被广泛认为是最具代表性和实用性的,它们犹如机器学习领域的 “十大神器”,各自发挥着独特的作用。这十大算法包括线性回归、逻辑回归、决策树、随机森林、K - 近邻算法、K - 平均算法、支持向…

vue脚手架开发打地鼠游戏

游戏设计: 规划游戏的核心功能,如场景、随机出现的地鼠、计分系统、游戏时间限制等。简单设计游戏流程,包括开始界面、游戏进行中、关卡设置(如不同关卡地鼠出现数量、游戏时间等)、关卡闯关成功|失败、游戏结束闯关成…

Web 后端 请求与响应

一 请求响应 1. 请求(Request) 客户端向服务器发送的HTTP请求,通常包含以下内容: 请求行:HTTP方法(GET/POST等)、请求的URL、协议版本。 请求头(Headers):…

Linux的基础指令和环境部署,项目部署实战(下)

目录 上一篇:Linxu的基础指令和环境部署,项目部署实战(上)-CSDN博客 1. 搭建Java部署环境 1.1 apt apt常用命令 列出所有的软件包 更新软件包数据库 安装软件包 移除软件包 1.2 JDK 1.2.1. 更新 1.2.2. 安装openjdk&am…

DeepSeek在linux下的安装部署与应用测试

结合上一篇文章,本篇文章主要讲述在Redhat linux环境下如何部署和使用DeepSeek大模型,主要包括ollama的安装配置、大模型的加载和应用测试。关于Open WebUI在docker的安装部署,Open WebUI官网也提供了完整的docker部署说明,大家可…

罗德与施瓦茨ZNB20,矢量网络分析仪9KHz-20GHz

罗德与施瓦茨ZNB20矢量网络分析仪9KHz-20GHz R&SZNB20矢量网络分析仪 产品型号: ZNB20 产品品牌:罗德与施瓦茨 R&S 产品名称: 矢量网络分析仪 频率范围:9kHz - 20GHz R&S ZNB 矢量网络分析仪 良好的测量速度、动态范围和操作方便性&am…

axios post请求 接收sse[eventsource]数据的

axios 接收sse数据的 axios 接收sse数据的 EventSource什么 基于 HTTP 协议实现,通过与服务器建立一个持续连接,实现了服务器向客户端推送事件数据的功能。在客户端,EventSource 对象通过一个 URL 发起与服务器的连接。连接成功后&#xff0…

Python----数据结构(双向链表:节点,是否为空,长度,遍历,添加,删除,查找,循环链表)

一、双向链表 1.1、概念 双向链表是一种链表数据结构,每个节点除了包含指向下一个节点的指针外,还包含指向前一个节点的指针。这种特性使得在双向链表中,可以从任意一个节点开始,向前或向后遍历链表。 1.2、特点 • 既可以从…

VScode内接入deepseek包过程(本地部署版包会)

目录 1. 首先得有vscode软件 2. 在我们的电脑本地已经部署了ollama,我将以qwen作为实验例子 3. 在vscode上的扩展商店下载continue 4. 下载完成后,依次点击添加模型 5. 在这里可以添加,各种各样的模型,选择我们的ollama 6. 选…

投资组合风险管理

投资组合风险管理 市场风险 信用风险流动性风险风险指标收益率波动率最大回撤 α \alpha α(詹森指数), β \beta β卡玛比率月胜率上/下行捕获比夏普比率索提诺比率经风险调整的收益率(𝑀2)特雷诺比率信息…

Mongodb数据管理

Mongodb数据管理 1.登录数据库,查看默认的库 [rootdb51~]# mongo> show databases; admin 0.000GB config 0.000GB local 0.000GB> use admin switched to db admin > show tables system.version > admin库:admin 是 MongoDB 的管理…

GTP3 大模型

GTP3 大模型 模型架构训练核心思想 GTP3 : OpenAI 在 2020 年 5 月发布 GPT-3,发表 Language Models are Few-Shot Learner理念:Few-Shot 思想 , 用少量样本微调,让模型更准确 参数 : 最大模型 : 1750 亿参数多头 Transformer : 96 层Head…

神经网络实验——MLP

目录 1 目的 2 方法 3 源代码 4 结果 1 目的 ①熟悉 Python 的输入输出流; ②学会使用 matplotlib进行图像可视化; ③掌握神经网络的基本原理,学会使用 sklearn 库中的 MLPClassifier 函数构建基础的多层感知机神经网络分类器; ④学会使用网格查找进行超参数优…