【Vue】为什么Vue3使用Proxy代替defineProperty?

news/2025/2/19 16:56:34/

先来看看 Vue2 中 defineProperty 来操作数据:

const obj = {a: 1,b: 2,c: {a: 1,b: 2}
}
function _isObject(v) {return typeof v === 'object' && v !== null;
}
function observe(object) {for (let key in object) {let v = object[key];if (_isObject(v)) {observe(v)}Object.defineProperty(object, key, {get() {console.log('read ' + key);return v;},set(val) {if (val !== v) {console.log('change ' + key);v = val;}}})}
}
observe(obj)
// obj.a = 3;
obj.c.a = 4;

所以 Vue2 的缺陷是无法监听到属性的增加和删除,因为只有 getter 和 setter 函数。此外,还通过深度遍历,有效率的损失,将属性变成 getter 和 setter 函数。

而 Vue3 中Proxy 直接监听整个对象的变化:

const obj = {a: 1,b: 2,c: {a: 1,b: 2}
}
function _isObject(v) {return typeof v === 'object' && v !== null;
}
function observe(obj) {const proxy = new Proxy(obj, {get(target, k) {let v = target[k]if (_isObject(v)) {v = observe(v);}console.log('read', k)return v;},set(target, k, val) {if (target[k] !== val) {target[k] = val;console.log('change', k)}}// ....})return proxy;
}proxy.a = 3;
proxy.aa;

不监听属性,而是监听整个代理对象。只有当读取到对象属性的时候才会进行遍历监听。


http://www.ppmy.cn/news/1336041.html

相关文章

Redis -- 背景知识

目录 特性 为啥Redis快? 应用场景 Redis不能做什么? Redis是在内存中存储数据的一个中间件,用作为数据库,也可以用作为缓存,在分布式中有很高的威望。 特性 In-memory data structures:在内存中存储数据key-val…

PMP五大过程组:项目成功的金钥匙

在项目管理领域,PMP(项目管理专业)一直被视为权威的标准。PMP认证的项目管理方法论,即五大过程组和十大知识领域,为项目管理提供了一套完整、系统的方法论。五大过程组作为PMP的核心,涵盖了项目从开始到结束…

C++ STL中list迭代器的实现

list 的模拟实现中,重难点在于迭代器功能的实现,因此本文只围绕 iterator 及 const_iterator 的设计进行介绍,其余如增删查改则不再赘述——在C语言的基础上,这些都非常简单。 与 string / vector 不同,list 的节点原生…

flink-cdc实战之oracle问题记录01

记录问题,温暖你我,上台 欢迎点赞留言关注 2024-01-26 11:02:56,168 ERROR Oracle|oracle_logminer|streaming Mining session stopped due to the {} [io.debezium.connector.oracle.logminer.LogMinerHelper] io.debezium.DebeziumException: Sup…

python sklearn labelencoder、OneHotEncoder和get_dummies的区别

文章目录 labelencoderOneHotEncoderget_dummiesLabelBinarizer labelencoder LabelEncoder 将不连续的数字or文本进行编号 import numpy as np import pandas as pd data pd.DataFrame({"学号":[1001,1002,1003,1004],"性别":["男","女…

初学者必会的100个Python编程代码,入门全套资料都给朋友们整理好了,文末免费领!

我记得刚开始接触编程的时候,觉得太难了。 也很好奇,写代码的那些人也太厉害了吧?全是英文的,他们的英文水平一定很好吧? 他们是怎么记住这么多代码格式的?而且错了一个标点符号,整个程序都会…

第二章、动态规划算法(2.6.5-2.6.5.4)------单序列问题(4)

目录 2.6.5最长回文子序列问题 2.6.5.1问题 2.6.5.2确定动态规则(DP、状态转移方程)、初始值 (1)直接相关状态 (2)当前状态值的确定 (3)动态规则(DP、状态转移方程) 2.6.5.3确定初始值 2.6.5.4动态规划算法代码实现 (1)按length、i循环动态规划求解 (2)按i、j循环动态规划求解 …

如何使用Python Flask搭建一个web页面并实现远程访问

文章目录 前言1. 安装部署Flask并制作SayHello问答界面2. 安装Cpolar内网穿透3. 配置Flask的问答界面公网访问地址4. 公网远程访问Flask的问答界面 前言 Flask是一个Python编写的Web微框架,让我们可以使用Python语言快速实现一个网站或Web服务,本期教程…