深入理解JavaScript - Proxy模拟vue的代理

news/2024/10/18 16:48:45/

视频链接
⚠️视频里使用proxy的代码不能用!!!

(1)简单使用

javascript">const obj = {a: 1,b: 2,c: {a: 1,b: 2,},
};
let v = obj.a;
Object.defineProperty(obj, "a", {get() {console.log("读取", 'a');},set(val) {if (v !== val) {console.log("更改", "a");v = val;}}})

(2)递归调用

javascript">let _vue = {};
function _isObject(v) {return typeof v === 'object' && v != null;
}
function observe(obj) {let _vfor (const k in obj) {let v = obj[k];if (_isObject(v)) {observe(v);} else {Object.defineProperty(obj, k, {get() {console.log("读取", k);return },set(val) {if (v !== val) {console.log("更改", k);v = val;}}})}}
}
const obj = {a: 1,b: 2,c: {c1: 1,c2: 2,},
};
observe(obj);obj.a; 
obj.a = 3;
obj.c.c1;
obj.c.c2 = 4;

2、Proxy

javascript">let target = {a: 1,b: 2,c: {c1: 1,c2: 2}
}
function _isObject(val) {return typeof val === 'object' && val !== null;
}function observer(target) {let proxy = new Proxy(target, {get(trapTarget, prop, receiver) {/*** 设置对象c下面的属性c1 时,分为2步,首先读取c,然后再设置c1,* 所以我们在get捕获器中判断如果读取的是对象,则返回代理。 */if (_isObject(trapTarget[prop])) {return observer(trapTarget[prop])}else{return trapTarget[prop];}},set(trapTarget, prop, val, receiver) {// console.log(trapTarget, prop, val, receiver);trapTarget[prop] = valreturn true;}});return proxy;
}  
let proxy = observer(target); 
proxy.c.c1 = 11;//
console.log(proxy.c.c1);
proxy.c.c2 = 12;//
console.log(proxy.c.c2);
console.log(target);

设置对象c下面的属性c1 时,分为2步,首先读取c,然后再设置c1,所以我们在get捕获器中判断如果读取的是对象,则返回代理对象。


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

相关文章

Jmeter自动化测试实施方案

🍅 视频学习:文末有免费的配套视频可观看 🍅 关注公众号:互联网杂货铺,回复1 ,免费获取软件测试全套资料,资料在手,涨薪更快 Jmeter是目前最流行的一种测试工具,基于此工…

对于地理空间数据,PostGIS扩展如何在PostgreSQL中存储和查询地理信息?

文章目录 一、PostGIS扩展简介二、PostGIS存储地理空间数据1. 创建空间数据表2. 插入空间数据 三、PostGIS查询地理空间数据1. 查询指定范围内的地理空间数据2. 计算地理空间数据之间的距离3. 对地理空间数据进行缓冲区分析 四、总结 地理空间数据是指描述地球表面物体位置、形…

算法课程笔记——STL键值对map

map当下标无限的数组 重点是对应关系&#xff0c;一般不修改compare 类比set 没有lowerbound&#xff0c;因为遍历是无序的 ; map不能用sort函数排序 但可用vector转化为map使用 std::set<std::pair<TKEY, mutable TVAL> > ≈ std::map<TKEY, TVAL>

【C++初识继承】

博主首页&#xff1a; 有趣的中国人 专栏首页&#xff1a; C进阶 本篇文章主要讲解 继承 的相关内容 目录 1. 继承的概念和定义 1.1 继承的概念 1.2 继承的定义 1.2.1 继承定义格式 1.2.2 继承方式与访问修饰限定符 2. 基类和派生类对象赋值转换 3. 继承中的作用域 …

[2021最新]大数据平台CDH存储组件kudu之启用HA高可用(添加多个master)

今天在做kudu高可用的时候没有参考官网&#xff0c;直接按照常规方式&#xff08;添加角色—>编辑属性—>启动&#xff09;结果发现报错&#xff1f;然后参考了一下文档之后发现这玩意儿还有点玄学&#xff0c;做一下记录。 1.添加两个master。kudu master有leader和foll…

Linux命令超详细介绍

目录 安装 Linux的目录结构&#xff1a; Linux命令入门&#xff1a; Linux命令的基础格式&#xff1a; 例子&#xff1a; ls 参数 选项 注意&#xff1a; 目录切换命令&#xff1a;cd/pwd cd: pwd: 相对路径和绝对路径&#xff1a; mkdir 不用参数&#xff1a; …

使用Spring 完成转账业务添加日志功能

(完整的代码在文章附带文件中 , 文章里的代码仅作展示 , 可能有部分不完善 代码地址 :下载:https://javazhang.lanzn.com/i5oLI1vyiile 密码:1234 ) 任务目标 具体实现方法和心得 步骤1. 导入依赖项Spring依赖 , aop依赖,德鲁伊依赖,mybatis依赖 , mysql驱动 , mybatis-sprin…

如何避免用户并发请求以避免权限冲突问题,有数据库事务,乐观锁,悲观锁,分布式锁,队列化请求等

处理并发请求以避免权限冲突问题是一个重要的挑战&#xff0c;特别是在构建多用户、多线程或多进程的应用时。下面是一些策略和建议&#xff0c;帮助你处理并发请求并减少权限冲突的可能性&#xff1a; 数据库事务&#xff1a; 使用数据库事务来确保一组操作的原子性。这样&a…