Vue数据代理的原理

一、Object.defineProperty方法

我们可以使用一个Object.defineProperty方法给一个对象添加属性,并对该属性进行权限设置

语法格式如下:

Object.defineProperty(对象 , "属性名" , { // 配置项 })

javascript 复制代码
let Person = {
    name:"寻霖",
    age:18
}
Object.defineProperty(Person, "gender", {
    value:"女",
    enumerable:true,  // 控制属性是否可以枚举,默认值是false
    writable:true,  // 控制属性是否可以被修改,默认值是false
    configurable:true  // 控制属性是否可以被删除,默认值是false
})

我们可以利用Object.defineProperty方法中的 get() 和 set() 配置项连接一个变量和一个对象中的属性值,也就是变量改变属性值也变化,属性值变化对象也变化,就和MVVM模型很像。

javascript 复制代码
let num = 18;
let Person = {
    name:"寻霖",
}
Object.defineProperty(Person, "age", {
    // 当有人读取Person中的age属性时,get函数(getter)就会被调用,且返回值就是age的值
    get() {
        console.log("age属性被读取了");
        return num;
    },
    // 当有人修改Person中的age属性时,set函数(setter)就会被调用,且会收到修改后的值
    set(value) {
        console.log("age属性被修改了,且修改值为"+value);
        num = value;
    }
})

二、理解数据代理

数据代理就是一个对象代理对另一个对象中属性的操作(读/写)。

比如在如下代码中,我们在obj2对象中代理obj1对象的x属性:

javascript 复制代码
let obj1 = {x:100};
let obj2 = {y:200};
Object.defineProperty(obj2, "x", {
    get() {
        return obj1.x;
    },
    set(value) {
        obj1.x = value;
    }
})

三、Vue中数据代理的原理

首先我们先了解数据代理的作用:使我们编写代码简便

我们的Vue身上之所以有在data中编写的属性,就是使用的数据代理

我们在data中编写的数据全被Vue存在了_data中:

然后Vue通过Object.defineProperty方法使一个对象(Vue对象)在另一个对象(_data对象)中完成对数据的代理:

我们可以进行简单的验证:

这么做就是为了我们在编写模板字符串时只需要写 {{name}} 而不是 {{_data.name}}

相关推荐
张元清2 分钟前
useMediaQuery:React 响应式设计完全指南
前端·javascript·面试
小金鱼Y2 分钟前
一文吃透 JavaScript 防抖:从原理到实战,让你的页面不再 “手抖”
前端·javascript·面试
Z兽兽5 分钟前
React 18 开发环境下useEffect 会执行两次,原因分析及解决方案
前端·react.js·前端框架
紫_龙7 分钟前
最新版vue3+TypeScript开发入门到实战教程之Vue3详解props
前端·vue.js·typescript
树上有只程序猿14 分钟前
这波低代码热,能维持多久
前端
姓王名礼19 分钟前
这是一个完整的全栈交付包,包含Vue3 前端交互界面(集成数字人视频流、ECharts 图表、语音对话)和Docker Compose 一键部署脚本。
前端·docker·echarts
嵌入式-老费23 分钟前
vivado hls的应用(axis接口)
前端·webpack·node.js
孟陬30 分钟前
国外技术周刊第 2 期 — 本周热门 🔥 YouTube 视频 TED 演讲 AI 如何能够拯救(而非摧毁)教育
前端·后端·程序员
小飞大王6661 小时前
从零手写 React:深度解析 Fiber 架构与 Hooks 实现
前端·react.js·架构
进击的尘埃1 小时前
Nginx 反向代理 WebSocket 和 SSE 的踩坑
javascript