Vue(六):数据代理

一、js中的Object.defineProperty方法

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>回顾Object.defineProperty方法</title>
        <script type="text/javascript" src="../js/vue.js"></script>
    </head>
    <body>
        <script type="text/javascript">

            let number = 0;

            //创建一个对象
            let person = {
                name: "张三",
                sex: ""
            }

            /*
            这个方法是对对象的属性进行定义
            需要传入三个参数:1.对象 2.属性 3.配置
            */
            Object.defineProperty(person, "age", {
                
                //这是一些基础的配置属性
                // value: 18, //属性的值
                // enumerable: true, //控制属性是否可以被枚举(遍历),默认为false
                // writable: true, //控制属性是否可以被修改,默认为false
                // configurable: true, //控制属性是否可以被删除,默认为false
                

                //这是更高级一些的配置属性
                //当有人要获取person的age属性时,get方法(getter)调用,返回age的值
                get() {
                    return number;
                },
                //当有人要修改person的age属性时,set方法(setter)调用,对age的值进行修改
                set(value) {
                    number = value;
                }
            })

            console.log(person)
        </script>
    </body>
</html>

二、什么是数据代理

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>什么是数据代理</title>
        <script type="text/javascript" src="../js/vue.js"></script>
    </head>

    <body>
        <script type="text/javascript">

            //被代理数据
            let landlord = {
                name: "房东",
                price: 3000    
            }
            //代理数据
            let proxy = {
                name: "中介"
            }

            Object.defineProperty(proxy, "price", {
                get() {
                    return landlord.price
                },
                set(value) {
                    landlord.price = value
                }
            })
        </script>
    </body>
</html>

数据代理就是通过一个对象来操作另一个对象的数据(属性)。

三、Vue中的数据代理

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Vue中的数据代理</title>
        <script type="text/javascript" src="../js/vue.js"></script>
    </head>

    <body>
        <div id="root">
            <h1>姓名:{{name}}</h1>
            <h1>年龄:{{age}}</h1>
        </div>
    </body>
    
    <!--
        Vue中的数据代理:
            1.Vue在什么地方用到了数据代理呢?
            前面提到过Vue将data对象中的属性添加为vm的属性,这里使用的就是数据代理,用vm的属性来代理data对象中的属性。
            2.data数据放在什么地方?
            data数据放在vm中的一个名为 _data 的属性中。
            _data实际上就是data,但是_data在data地基础上添加了一些新的东西(数据劫持)
            3.Vue数据代理的好处?
            因为data对象的数据实际上在vm是存在的(_data中),所以如果不使用数据代理,直接使用 {{_data.XXX}} 的形式一样可以去的数据,但是过于繁琐。
            使用数据代理就是为了更加方便直接地操作数据。
            4.Vue中数据代理地基本原理
            通过Object.defineProperty方法将_data中的属性添加到vm上,为每一个属性都添加一个getter和setter,使用getter和setter操作_data中的数据。
    -->

    <script type="text/javascript">
        let vm = new Vue({
            el: "#root",
            data: {
                name: "张三",
                age: 18
            }
        })
    </script>
</html>

 Vue数据代理示意图

 

(本文仅作个人学习记录用, 如有纰漏敬请指正)

posted @ 2023-06-23 17:32  谁知道水烫不烫  阅读(9)  评论(0编辑  收藏  举报