浅谈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 相关文章推荐
CSS+Jquery实现页面圆角框方法大全
Dec 24 Javascript
js下关于onmouseout、事件冒泡的问题经验小结
Dec 09 Javascript
跨浏览器通用、可重用的选项卡tab切换js代码
Sep 20 Javascript
JQuery在页面中添加和除移DOM示例代码
Jun 24 Javascript
JavaScript实现带标题的图片轮播特效
May 20 Javascript
jqGrid 学习笔记整理——进阶篇(一 )
Apr 17 Javascript
jQuery弹出层后禁用底部滚动条(移动端关闭回到原位置)
Aug 29 Javascript
js当前页面登录注册框,固定div,底层阴影的实例代码
Oct 04 Javascript
js实现简单的选项卡效果
Feb 23 Javascript
详解Vue 非父子组件通信方法(非Vuex)
May 24 Javascript
vue插件draggable实现拖拽移动图片顺序
Dec 01 Javascript
element表格翻页第2页从1开始编号(后端从0开始分页)
Dec 10 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中header和session_start前不能有输出原因分析
2013/01/11 PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
2014/08/18 PHP
通过修改referer下载文件的方法
2008/05/11 Javascript
40款非常棒的jQuery 插件和制作教程(系列一)
2011/10/26 Javascript
javascript对talbe进行动态添加、删除、验证实现代码
2012/03/29 Javascript
jQuery随便控制任意div隐藏的方法
2013/06/28 Javascript
Java/JS获取flash高宽的具体方法
2013/12/27 Javascript
javascript事件函数中获得事件源的两种不错方法
2014/03/17 Javascript
jquery带动画效果幻灯片特效代码
2015/08/27 Javascript
CodeMirror js代码加亮使用总结
2017/03/25 Javascript
20行js代码实现的贪吃蛇小游戏
2017/06/20 Javascript
AngularJS实现进度条功能示例
2017/07/05 Javascript
layui数据表格 table.render 报错的解决方法
2019/09/29 Javascript
vue中路由跳转不计入history的操作
2020/09/21 Javascript
[05:15]DOTA2英雄梦之声_第16期_灰烬之灵
2014/06/21 DOTA
[51:20]完美世界DOTA2联赛PWL S2 Magma vs PXG 第一场 11.28
2020/12/01 DOTA
Python过滤列表用法实例分析
2016/04/29 Python
Python实现快速排序算法及去重的快速排序的简单示例
2016/06/26 Python
Python两个内置函数 locals 和globals(学习笔记)
2016/08/28 Python
python生成式的send()方法(详解)
2017/05/08 Python
Python实现压缩和解压缩ZIP文件的方法分析
2017/09/28 Python
python中hashlib模块用法示例
2017/10/30 Python
对python中dict和json的区别详解
2018/12/18 Python
Python面向对象实现方法总结
2020/08/12 Python
浅谈基于Canvas的手绘风格图形库Rough.js
2018/03/19 HTML / CSS
DogBuddy荷兰:找到你最完美的狗保姆
2019/04/17 全球购物
师范生实习个人的自我评价
2013/09/28 职场文书
办公文员的工作岗位职责
2013/11/12 职场文书
职业技术学校毕业生推荐信
2013/12/03 职场文书
教学质量评估实施方案
2014/03/17 职场文书
运动会广播稿200字(10篇)
2014/10/12 职场文书
小学语文教师年度考核个人总结
2015/02/05 职场文书
利用Python+OpenCV三步去除水印
2021/05/28 Python
Java面试题冲刺第十七天--基础篇3
2021/08/07 面试题
CSS 使用 resize 实现图片拖拽切换预览功能(强大功能)
2021/08/23 HTML / CSS
MySQL使用IF语句及用case语句对条件并结果进行判断 
2022/09/23 MySQL