Vue数据动态代理机制的实现

Object.defineProperty()

(1)这个方法是ES5新增的

(2)这个方法的作用是:给对象新增属性,或者设置对象原有的属性

(3)用法:Object.defineProperty(给哪个对象新增属性,'新增的属性名是什么',{给新增的属性设置相关的配置项key:value对})

补充:配置项有哪些?

①value配置项:给属性指定值

②writable配置项:设置该属性的值是否可以修改。true表示可以修改,false表示不能修改

③getter方法 配置项:不需要我们手动调用。当读取属性值的时候,getter方法被自动调用。

a.getter方法的返回值非常重要,这个返回值就代表这个属性它的值。

④setter方法 配置项:不需要我们手动调用。当修改属性值的时候,setter方法被自动调用。

a.setter方法上有一个参数,这个参数可以接收传过来的值

⑤当配置项当中有setter和getter的时候,value和writable配置项都不能写

html 复制代码
<body>
    <script>
        //  一个普通对象 
        let phone = {}
        // 临时变量 
        let temp;
        // 给上面的phone对象新增一个color属性
        Object.defineProperty(phone, 'color', {
            // value: '太空侠',
            // writable: true,
            get: function () {
                console.log('getter方法执行了');
                return temp;
            },
            set: function (val) {
                console.log('setter方法执行了');
                temp = val;
            }
        })
    </script>
</body>

数据代理机制的实现

(1)什么是数据代理机制?

通过访问代理对象的属性来间接访问目标对象的属性。数据代理机制的实现需要依靠:Object.defineProperty()方法

(2)ES6新特性:在对象中的函数/方法 :function是可以省略的

html 复制代码
<body>

    <script>
        //  目标对象 
        let target = {
            name : 'zhangsan'
        }
        // 代理对象 
        let proxy = {}
        // 如果要实现数据代理机制的话,就需要给proxy新增一个name属性
        // 注意:代理对象新增的这个属性的名字 和 目标对象的属性名要一致
        Object.defineProperty(proxy, 'name', {
            get: function () {
            //   间接访问目标对象的属性
                return target.name;
            },
            set: function (val) {
                target.name = val;
            }
        })
    </script>
</body>

(3)属性名有(...)的代表是代理对象

相关推荐
小白学习日记40 分钟前
【复习】HTML常用标签<table>
前端·html
程序员大金43 分钟前
基于SpringBoot+Vue+MySQL的装修公司管理系统
vue.js·spring boot·mysql
john_hjy44 分钟前
11. 异步编程
运维·服务器·javascript
风清扬_jd1 小时前
Chromium 中JavaScript Fetch API接口c++代码实现(二)
javascript·c++·chrome
丁总学Java1 小时前
微信小程序-npm支持-如何使用npm包
前端·微信小程序·npm·node.js
yanlele1 小时前
前瞻 - 盘点 ES2025 已经定稿的语法规范
前端·javascript·代码规范
It'sMyGo2 小时前
Javascript数组研究09_Array.prototype[Symbol.unscopables]
开发语言·javascript·原型模式
懒羊羊大王呀2 小时前
CSS——属性值计算
前端·css
xgq2 小时前
使用File System Access API 直接读写本地文件
前端·javascript·面试
李是啥也不会2 小时前
数组的概念
javascript