当前位置: 首页 > news >正文

Vue--》Vue中实现数据代理

目录

Object.defineProperty

那么在Vue中如何应用数据代理呢?

Object.defineProperty

defineProperty方法会直接在一个对象上定义一个新属性,或者修改另一个对象的现有属性,并返回此对象,通常使用 get 进行读取,用 set 进行修改。

注意:defineProperty定义的属性是不能进行枚举(不能参与遍历)的

<body>
    <script>
        let person = {
            name:'张三',
            sex:'男'
        }
        Object.defineProperty(person,'age',{
            value:18
        })
        console.log(Object.keys(person));
        console.log(person);
    </script>
</body>

当然,defineProperty内部的属性我们自己控制,可以根据需求进行一定修改,如下:

Object.defineProperty(person,'age',{
    value:18,
    enumerable:true, //控制属性是否可以枚举,默认值是false
    writable:true, //控制属性是否可以被修改,默认值是false
    configurable:true, //控制属性是否可以被删除,默认值是false
})

definedProperty最重要的点就是get和set了,如下:

<script>
    let number = 18
    let person = {
        name:'张三',
        sex:'男'
    }
    Object.defineProperty(person,'age',{
        // 当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age值
        get(){
            console.log('有人读取了age属性');
            return number
        },
        // 当有人修改person的age属性时,set函数(setter)就会被调用,且会收到修改的具体值
        set(value){
            console.log('有人修改了age属性,且值是',value);
            number = value
        }
    })
</script>

根据上文的简述,我们理解数据代理就是:通过一个对象代理对另一个对象中属性的操作(读/写)

<script>
    let obj = {x:100}
    let obj1 = {y:200}
    Object.defineProperty(obj1,'x',{
        get(){
            return obj.x
        },
        set(value){
            obj.x = value
        }
    })
</script>

那么在Vue中如何应用数据代理呢?

<body>
    <div id="root">
        <h2>姓名:{{name}}</h2>
        <h2>年龄:{{age}}</h2>
    </div>
    <script src="/Vue.js/vue.js"></script>
    <script>
        Vue.config.productionTip = false; //阻止 vue 在启动时生成生产提示
        new Vue({
            el:'#root',
            data:{
                name:'张三',
                age:18
            }
        })
    </script> 
</body>

可以看出 vm 身上有我们data里面的name和age属性,所以当我们访问data上面的name或age的时候,getter开始工作;如果通过vm去修改这个name或age时,setter开始工作。即在data里面的数据是有自己的get和set,如下:

get的实现:很简单,当我们修改data.name的时候,我们在查看name的时候,name的值就是data.name的值,如下:

set的实现:当我们进行修改name的时候,直接在控制台修改name的值。

name的值的的确确是被修改了也渲染到页面上去了,但我们怎么保证是data.name里面的name也被真真修改了呢?现在分析一下,data里面的name到底改没改。

注意:我们不能直接在控制台输入data.name来查看,因为data仅仅是Vue里面配置项的一个属性,并不是全局变量,是不能进行访问的,如果访问会报下面这样的错误。

那么我们如何拿到data里面的name呢?在Vue中vm会把data里面的数据存在 _data 里面,所以说vm._data的data就是我们存放数据的data,那么如何验证呢?既然我们不能访问到Vue里面的data,那么我们把Vue里面的data的数据给写到全局变量里面,然后Vue再引用全局上的data,这样我们就可以验证,Vue自带的 _data 的数据是不是和Vue实例里面的data数据相等。

<script>
    Vue.config.productionTip = false; //阻止 vue 在启动时生成生产提示
    let data = {
        name:'张三',
        age:18
    }
    const vm = new Vue({
        data
    })
    vm.$mount('#root')
    // 接下来我们验证 vm._data = options.data = data 是不是true;options.data就是Vue里面配置项的data;data就是我们定义在外面的data
    console.log(Boolean(vm._data = vm.data = data)); //true
</script>

 数据代理说白了就是把data里面的数据放一份到 vm 上面,目的就是为了当编码更方便。

总结

Vue中的数据代理

通过vm对象来代理data对象中属性的操作(读/写)

Vue中数据代理的好处

更加方便的操作data中的数据

基本原理

通过Object.defineProperty()把data对象上所有属性添加到vm上。为每个添加到vm上的属性都指定一个getter/setter。在getter/setter内部去操作(读/写)data中对应的属性。

相关文章:

  • 【Python学习笔记】第二章循环:while循环,for循环,break和continue语句,死循环,循环的嵌套
  • 计算机网络【IP协议与以太网】
  • iVX低代码平台系列详解 --界面功能(一)
  • 硬件科普系列之硬盘——总线、协议、接口和固态硬盘篇
  • 目标检测算法——遥感影像数据集资源汇总(附下载链接)
  • 第一章 时间复杂度和空间复杂度
  • 【论文阅读】SimGNN:A Neural Network Approach to Fast Graph Similarity Computation
  • Spring源码分析之AOP
  • 【0136】【libpq】startup packet应用机制及构建过程(6)
  • 如今Android 工作难找,面试也难~ 这是在劝退吗?
  • WebShell后门检测与WebShell箱子反杀
  • Java毕业设计选题推荐 SpringBoot毕设项目分享
  • 【Linux kernel/cpufreq】framework ----cpufreq core(1)
  • 一文2000字手把手教你自动化测试平台建设分享
  • 国务院:电子印章跨地区跨部门互信互认,契约锁助力企业办事提效
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Brief introduction of how to 'Call, Apply and Bind'
  • co.js - 让异步代码同步化
  • es6(二):字符串的扩展
  • Git初体验
  • Material Design
  • MySQL数据库运维之数据恢复
  • Puppeteer:浏览器控制器
  • Xmanager 远程桌面 CentOS 7
  • 安卓应用性能调试和优化经验分享
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 编写符合Python风格的对象
  • 大数据与云计算学习:数据分析(二)
  • 大型网站性能监测、分析与优化常见问题QA
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 前端知识点整理(待续)
  • 前嗅ForeSpider教程:创建模板
  • 硬币翻转问题,区间操作
  • 最简单的无缝轮播
  • 2017年360最后一道编程题
  • RDS-Mysql 物理备份恢复到本地数据库上
  • Spring第一个helloWorld
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #LLM入门|Prompt#3.3_存储_Memory
  • (4)Elastix图像配准:3D图像
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (七)c52学习之旅-中断
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (转)为C# Windows服务添加安装程序
  • (转载)从 Java 代码到 Java 堆
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .net core控制台应用程序初识
  • .Net IE10 _doPostBack 未定义
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .net连接MySQL的方法
  • .net中的Queue和Stack