响应式实现的原理---如何监控数据的变化:两种方法
Vue 2.x defineProperty(es5)
Vue 3.x Proxy(es6)
语法:Object.defineProperty(参数1,参数2,参数3)
参数1:目标对象
参数2:需要修改或者添加的属性名
参数3:目标对象属性的一些特征(是一个对象)
其中参数3中也有一些参数:
参数1:value:属性值
参数2:writable:对象属性值是否可被修改,true表示允许,false表示不允许
参数3:configurable:对象属性是否可被删除,true为允许,false为不允许
参数4:enumerable:对象属性是否可被枚举(即遍历)
参数5:get():给一个属性提供getter方法,当访问这个对象的属性值时触发该方法
参数6:set():给一个属性提供setter方法,当设置这个对象的属性值时触发该方法
这种方式通过下标更改对象属性,或者直接改变数组长度等,就不能检查到是否更改了属性
var obj = {a:1} object.defineProperty(obj,"wa",{value : 5 }) var obj = { a: 1 } Object.defineProperty(obj, 'wa', { //添加一个新属性wa,当检测到wa的值改变时,触发set()函数,这时在set()函数中给obj的就旧属性a重新赋值 set(value) { obj.a = value; } }) obj.wa = 123; console.log(obj.a);
可以通过es6的代理(Proxy)来监测,可以对数据改变和数据截取做劫持
Proxy的作用
对于代理模式 Proxy 的作用主要体现在三个方面:
1、 拦截和监视外部对对象的访问
2、 降低函数或类的复杂度
3、 在复杂操作前对操作进行校验或对所需资源进行管理
var obj = { a: 1 } var pa = new Proxy(obj, { set(target, property, value) { console.log(target, property, value) target[property] = value; }, get(target, property) { alert("获取到了obj的a值") return target[property]; } }) pa.a = 12345
//pa代理了obj 也就是pa拦截了目标对象obj的访问。所有访问obj属性的操作都被get()函数拦截,
所有设置属性都被set()函数拦截,所以,handle就是一个拦截处理函数,必须使用pa(代理对象)代理才能生效,
console.log(pa.a);
代理的作用就是拦截监控外部对对象的访问
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)