浅谈vue中数据双向绑定的实现原理


Posted in Javascript onSeptember 14, 2017

vue中最常见的属v-model这个数据双向绑定了,很好奇它是如何实现的呢?尝试着用原生的JS去实现一下。

首先大致学习了解下Object.defineProperty()这个东东吧!

* Object.defineProperty()
    *  对对象的属性进行 定义/修改
    * */

    let obj = {x:10}
    // 这两种方式都相对来说比较简单,直接,但是有些时候我们需要对对象的属性的修改和增加进行必要的干预
//    obj.y = 20;
//    obj.x = 100;
//    obj.x = 'abc';
//
//    let arr = [1,2,3];
//    arr.length = 'abc';//不可更改
//    console.log(arr);

//    console.log(obj.x);
//    delete obj.x;
//    console.log(obj);

    Object.defineProperty(obj, 'y', {
      configurable: false,  //设置是否可删除 false为不可删除
      value: 100
    });

    console.log(obj);
    delete obj.y;//删除
    console.log(obj);
    //设置对象某个属性值的时候,顺便设置它的属性。enumerable 可枚举 configurable 可以删除否 writable 可改值否
    Object.defineProperty(obj, 'z', {//enumerable 可枚举(没有则新添加) 
      enumerable: true,//为false时,for..in object.keys json.stringfy 不能取到该z属性
      value: 10000
    });

    for (var attr in obj) {
      console.log(attr);
    }

    Object.defineProperty(obj, 'm', {
      writable: false,//可更改
      value: 9
    });

    console.log(obj);
    obj.m = 100;
    console.log(obj);

以上总结了对象的defineProperty四个属性:configurable,enumerable,value,writable

接下来再深入认识下它的另外两个方法:set 以及get

注意:get和set不能与configurable,enumerable,value,writable同时存在

let obj = {x:10}

    let y = 100;
    Object.defineProperty(obj, 'y', {
      get() {
        //当obj的y属性被调用的时候触发,该方法的返回值将作为获取的结果
        console.log('get');
        return y;
      },
      set(value) {
        //当obj的y属性被设置的时候触发
        console.log('set', value);
        y = value;
      }
    })

    console.log(obj.y);
    obj.y = 1;
    console.log(obj.y);

浅谈vue中数据双向绑定的实现原理

介绍完defineProperty了,最后我们一起看看如何简单的实现数据双向绑定吧!

<body>

  <input type="text" id="age">
  <h1></h1>

  <script>

    var ageElement = document.querySelector('#age');
    var h1Element = document.querySelector('h1');

    let obj = {};

    Object.defineProperty(obj, 'age', {
      get() {

      },
      set(value) {
        ageElement.value = value;
        h1Element.innerHTML = value;
      }
    })

    obj.age = 10;

    ageElement.oninput = function() {
      obj.age = this.value;
    }
    
  </script>

浅谈vue中数据双向绑定的实现原理

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JQuery从头学起第二讲
Jul 04 Javascript
基于Jquery实现表格动态分页实现代码
Jun 21 Javascript
Javascript对象中关于setTimeout和setInterval的this介绍
Jul 21 Javascript
jQuery控制TR显示隐藏的三种常用方法
Aug 21 Javascript
node.js中的fs.writeFile方法使用说明
Dec 14 Javascript
javascript 应用小技巧方法汇总
Jul 05 Javascript
jQuery EasyUI编辑DataGrid用combobox实现多级联动
Aug 29 Javascript
微信小程序中子页面向父页面传值实例详解
Mar 20 Javascript
laravel-admin 与 vue 结合使用实例代码详解
Jun 04 Javascript
微信小程序实现拖拽功能
Sep 26 Javascript
记录微信小程序 height: calc(xx - xx);无效问题
Dec 30 Javascript
vue中的双向数据绑定原理与常见操作技巧详解
Mar 16 Javascript
JavaScript动态绑定详解
Sep 14 #Javascript
React-Native使用Mobx实现购物车功能
Sep 14 #Javascript
JavaScript requestAnimationFrame动画详解
Sep 14 #Javascript
SVG动画vivus.js库使用小结(实例代码)
Sep 14 #Javascript
浅谈AngularJS中使用$resource(已更新)
Sep 14 #Javascript
jQuery plugin animsition使用小结
Sep 14 #jQuery
angular.extend方法的具体使用
Sep 14 #Javascript
You might like
php include加载文件两种方式效率比较
2010/08/08 PHP
PHP多例模式介绍
2013/06/24 PHP
PHP版微信小店接口开发实例
2016/11/12 PHP
Zend Framework使用Zend_Loader组件动态加载文件和类用法详解
2016/12/09 PHP
使用ThinkPHP生成缩略图及显示
2017/04/27 PHP
Yii框架实现记录日志到自定义文件的方法
2017/05/23 PHP
PHP实现二维数组中的查找算法小结
2018/06/09 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
2020/05/27 PHP
Javascript 汉字字节判断
2009/08/01 Javascript
jQuery 事件队列调整方法
2009/09/18 Javascript
jquery ajax同步异步的执行最终解决方案
2013/04/26 Javascript
javaScript实现浮点数转十六进制字符
2013/10/29 Javascript
jQuery动画与特效详解
2015/02/01 Javascript
Javascript中prototype属性实现给内置对象添加新的方法
2015/05/14 Javascript
javascript实现文字无缝滚动
2016/12/27 Javascript
微信小程序实战篇之购物车的实现代码示例
2017/11/30 Javascript
详解Angular路由之路由守卫
2018/05/10 Javascript
VSCode 添加自定义注释的方法(附带红色警戒经典注释风格)
2020/08/27 Javascript
Nodejs + sequelize 实现增删改查操作
2020/11/07 NodeJs
vue使用transition组件动画效果的实例代码
2021/01/28 Vue.js
[01:29:46]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第二局
2016/02/27 DOTA
[02:12]Dota 2 推出全新英雄—— 电炎绝手
2019/08/23 DOTA
python 字典(dict)遍历的四种方法性能测试报告
2014/06/25 Python
python获取文件后缀名及批量更新目录下文件后缀名的方法
2014/11/11 Python
Python文件及目录操作实例详解
2015/06/04 Python
python数据类型_字符串常用操作(详解)
2017/05/30 Python
numpy.delete删除一列或多列的方法
2018/04/03 Python
基于DataFrame筛选数据与loc的用法详解
2018/05/18 Python
python如何获取列表中每个元素的下标位置
2019/07/01 Python
纯CSS3实现扇形动画菜单(简化版)实例源码
2017/01/17 HTML / CSS
配置H5的滚动条样式的示例代码
2018/03/09 HTML / CSS
定制iPhone和Macbook保护壳:Slick Case
2018/11/21 全球购物
医学毕业生自我鉴定
2013/10/30 职场文书
班级活动策划书
2014/02/06 职场文书
文艺晚会策划方案
2014/06/11 职场文书
老龄工作先进事迹
2014/08/15 职场文书