让前端飞前端开发那些事全栈笔记

初窥vue响应式原理

2018-12-16  本文已影响4人  韭菜的故事

前言

随着vue的使用逐渐深入,偶尔会在项目中发现明明按照文档上面去做了,但是并没有实际效果的情况。或者在使用一些功能的时候发现官方文档上面提供的方法不足以解决问题,之后还得百度或者查api,于是乎我决定慢慢开始由浅入深的了解vue的内部原理,知其然,还得知其所以然,否则每次都是治标不治本。
最近参与了一个jQuery项目之后才蓦然发现vue的方便,那么,都说vue是一个响应式mvvm框架,习惯于data进行双向数据绑定之后并没有觉得有什么不妥,可是,更深入的时候才发现我的认知里还是一片空白的。翻阅官方文档的描述,发现vue原来是通过Object.defineProperty来追踪变化的。于是就以这篇文章就来记录一下我对Object.defineProperty的理解好了。

Object.defineProperty有什么用

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

属性描述符 descriptor

属性描述符——这个描述符里面一些属性,就如同字面上的意思一样,这些属性是用来描述和改写外面的属性prop的。属性描述符有两种形式:数据描述符存取描述符,属性描述符必须是这两者其中一种,不能同时是这两者。本文只重点介绍存取描述符

其实前两个是数据描述符和存取描述符共有的方法,get-set才是属性描述符特有的方法,而前文提到的value则是数据描述符特有的方法,可以用来改变prop的值,当然我们一般都会使用点语法直接给一个对象的属性赋值。

接下来简单的试一下

    let data = {};
    let domVal;
    console.log(domVal);// 1
    Object.defineProperty(data, "test", {
        enumerable: true,
        configurable: true,
        get: function () {
            return domVal;
        },
        set: function (newValue) {
            domVal = newValue;
        }
    });
    data.test = 5;
    console.log(domVal);// 5

domVal可以看作是在dom中绑定的值,当我们改变data中的test的值的时候domVal也会发生变化。当然这只是一个小小的演示,而vue中则要经过一个复杂的过程,最后才会编译到视图中去。所以以后有空我还会继续研究其中的奥秘。

最后,点击Object.defineProperty() | MDN,可以详细了解该方法的所有参数与属性。

转载请注明出处https://www.jianshu.com/p/0cdb522af67f

上一篇 下一篇

猜你喜欢

热点阅读