• vue双向数据绑定的原理-object.defineProperty() 用法


    有关双向数据绑定的原理

    关于数据双向绑定的理解:利用了 Object.defineProperty() 这个方法重新给对象定义了新属性,在操作新属性分别为为获取属性值(调用get方法)和设置属性值(调用set方法)的操作来实现的。双向:改变keyValue的值,obj.key的值会改变,重新设置obj.key,keyValue一样会随之改变。

    下面是博客园一篇博客,以及MDN上讲解Object.defineProperty()方法的地址。

    文章链接:vue的双向绑定原理及实现
    Mozilla 开发者服务:Object.defineProperty()

    因为内容比较长,就不转载了,只贴个连接在这里,有兴趣的可以直接点击链接访问。

    这里简单说一下个人的理解。

    vue实现双向数据绑定的原理就是利用了 Object.defineProperty() 这个方法重新定义了对象获取属性值(get)和设置属性值(set)的操作来实现的。

    在MDN上对该方法的说明是:Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。

    它接收三个参数,要操作的对象,要定义或修改的对象属性名,属性描述符。重点就是最后的属性描述符。

    属性描述符是一个对象,主要有两种形式:数据描述符和存取描述符。这两种对象只能选择一种使用,不能混合两种描述符的属性同时使用。上面说的get和set就是属于存取描述符对象的属性。

    然后我们可以通过在存取描述符中的get和set方法内写入自定义的逻辑来实现对象获取属性和设置属性时的行为。

    var keyValue = 1;
    var obj = {};
    Object.defineProperty(obj,'key', {
        enumerable: true,
        configurable: true,
        get: function(){
            return keyValue;
        },
        set: function(newValue){
            keyValue = newValue;
            console.log(`keyValue的值已发生改变,目前的值是:${keyValue}`);
        }
    });
    
    obj.key; // 1
    
    obj.key = 'obj对象的key属性已经绑定了变量keyValue的值';
    // keyValue的值已发生改变,目前的值是:obj对象的key属性已经绑定了变量keyValue的值
    // "obj对象的key属性已经绑定了变量keyValue的值"
    
    keyValue; // "obj对象的key属性已经绑定了变量keyValue的值"
    
    

    上面这个例子就是改变了对象获取属性及设置属性的默认行为。

    对象obj获取属性key的值时,会触发上面的get方法,得到的是变量keyValue的值,然后当重新设置key的值时,触发set方法,会将变量keyValue的值改变为设置的值,如此就实现了一个简单的双向绑定:改变keyValue,obj.key得到的值也会改变,重新设置obj.key,keyValue一样会随之改变。

    当然,vue的双向绑定实际更复杂,但最基本的原理就是基于Object.defineProperty()方法改变数据存取的默认行为来实现的。

  • 相关阅读:
    二十一、继承,组合
    Python学习笔记(一):命令行界面扫雷(详细)
    九、Spring Cloud 之旅 -- Config 集群配置中心
    八、Spring Cloud 之旅 -- Zuul 微服务集群网关
    ACM搜索专题(BFS,DFS,记忆化搜索等)
    在Java中使用XPath快速优雅的读取XML, JAXB真的是太繁重
    七、Spring Cloud 之旅 -- Hystrix 微服务保护和容错机制
    记录一次网站信息收集的实战
    编程范式总结
    Java 原生API 实现zip和unzip (用文件和响应流两种方式)
  • 原文地址:https://www.cnblogs.com/hanguidong/p/9508096.html
Copyright © 2020-2023  润新知