Vue之监测数据的原理(对象)

大家有没有想过,为什么vue可以监测到数据发生改变?其实底层借助了Object.defineProperty ,底层有一个Observer的构造函数

让我为大家简单的介绍一下吧!

我用对象为大家演示一下

javascript 复制代码
    const vm = new Vue({
        el: "#app",
        data: {
            obj: {
                a: 1,
                b: 2
            }
        }
    })
    console.log(vm._data);

我们有没有办法,我们修改了数据,控制台提示我们修改了这个数据

我们不借助vue来实现一下吧!

javascript 复制代码
    let data = {
        a: 1,
        b: 2
    }
    // 创建一个监测data的实例化对象
    let obs = new Observer(data)
    // 准备一个vm实例对象
    let vm = {}
    vm._data = data = obs
    function Observer(obj) {
        // 汇总成一个数组
        let keys = Object.keys(obj)
        keys.forEach(k => {
            // this 指向实例化对象上
            Object.defineProperty(this, k, {
                get() {
                    return obj[k]
                },
                set(val) {
                    obj[k] = val
                    console.log(k + "被修改了");
                }
            })
        })
    }

这是不完善的,在vue的底层还有功能这里没有实现,就比如vue可以直接vm.a = ?
,还有就是更深层次的监测,需要用到递归,日后为大家带来更有意思的代码

感谢大家的阅读,如有不对的地方,可以向我提出,感谢大家!

相关推荐
acheding24 分钟前
File System Access API 实战:让网页真正读写本地文件
前端·javascript·vue.js·编辑器·markdown
何时梦醒25 分钟前
⚛️ React 19 + TypeScript 深度学习笔记 —— 从组件化思维到 WebGPU 端侧 AI 落地
前端·javascript·人工智能
用户9385156350730 分钟前
从 Vite 脚手架到 WebGPU 推理:手写一个 DeepSeek-R1 浏览器端大模型 Demo
javascript·人工智能·全栈
acheding33 分钟前
把 CodeMirror 6 调教成 Markdown 编辑器:扩展、装饰与门面
javascript·vue.js·编辑器·markdown
labixiong38 分钟前
TypeScript 7.0 编译器用 Go 重写,速度暴增10倍——背后到底做了什么?
前端·javascript·go
weedsfly1 小时前
一个电商价格计算案例,带你学会前端开发中的责任链模式
前端·javascript·面试
An_s2 小时前
Android仿真翻页(一),基于pagecurl二开
前端·javascript·html
Shadow(⊙o⊙)2 小时前
高并发内存池:Part-1——定长内存池
java·前端·javascript
国服第二切图仔2 小时前
17-config命令 - 配置管理系统
java·前端·javascript
胡萝卜术11 小时前
当大模型遇上浏览器:用 React + WebGPU 在前端跑通 DeepSeek-R1 的实战笔记
前端·javascript·面试