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

ops/2024/11/15 4:50:42/

视频链接
⚠️视频里使用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/ops/8507.html

相关文章

JavaScript 实现大数简化,带单位显示

一、场景 在前端展示的数据时,如果数据数值太大,会导致展示的数据非常长,不仅用户不能迅速读出数值大小而且影响美观,此时我们需要将这种大数简化为带单位的数值,如 250000 转为 25.0万。 二、实现函数 // 大数简化函…

UBUNTU新版本,一键安装NETCDF,安装netcdf-c netcdf-v

UBUNTU新版本,一键安装NETCDF,安装netcdf-c netcdf-v_ubuntu安装netcdf-CSDN博客 UBUNTU新版本,一键安装NETCDF,安装netcdf-c netcdf-v 参考连接傻瓜式安装netcdf-fortran库 1)保存bash代码,文件名为netc…

【PHP快速上手(十四)】

目录 PHP快速上手(十四)PHP 中常用数据库操作使用 WHERE 子句进行条件查询使用 ORDER BY 子句进行排序使用 UPDATE 语句更新数据使用 DELETE 语句删除数据执行事务总结 PHP快速上手(十四) PHP 中常用数据库操作 当使用 PHP 中的…

非计算机专业考软考高项有必要吗?

我认为这非常重要。 看了你的介绍,如果你已经考取了会计证书,而且想要考取计算机专业的证书,或者你的职业规划涉及到计算机岗位,又或者你对计算机感兴趣,我建议你优先考虑软考,因为这个证书的含金量是有保…

Linux gettid()系统调用源码分析

1、gettid()系统调用作用 gettid() 是一个Linux系统调用&#xff0c;用于获取当前进程的线程ID。在使用此系统调用时&#xff0c;你需要包含 <sys/syscall.h> 头文件&#xff0c;并且可以通过直接调用或使用 syscall() 函数来进行系统调用。 注意&#xff1a;ps 中显示的…

List<int[]>[] g = new ArrayList[n];

在Java中&#xff0c;List<int[]>[] g new ArrayList[n]; 这行代码定义了一个数组 g&#xff0c;该数组的每个元素都是一个 ArrayList<int[]> 类型的对象。这里&#xff0c;n 是预期图中顶点的数量&#xff0c;因此 g 数组的长度是 n。 List<int[]>&#x…

用html写一个窗口风景动画

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>窗边风景动画</title><link rel"stylesheet" href"./style.css"> </head> <body><!-- 窗户 -->&l…

NLP vs. LLMs: 理解它们之间的区别

作者&#xff1a;Elastic Platform Team 随着人工智能持续发展并在无数行业解决问题&#xff0c;技术的一个关键部分是能够无缝地桥接人类语言和机器理解之间的差距。这就是自然语言处理&#xff08;NLP&#xff09;和大型语言模型&#xff08;LLMs&#xff09;的用武之地。它们…