浅谈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浮动DIV提示信息并自动隐藏的代码
Aug 29 Javascript
jQuery学习笔记(1)--用jQuery实现异步通信(用json传值)具体思路
Apr 08 Javascript
javascript 动态修改css样式方法汇总(四种方法)
Aug 27 Javascript
JQuery Dialog对话框 不能通过Esc关闭的原因分析及解决办法
Jan 18 Javascript
JavaScript实现垂直滚动条效果
Jan 18 Javascript
javascript事件的传播基础实例讲解(35)
Feb 14 Javascript
详解如何在React组件“外”使用父组件的Props
Jan 12 Javascript
结合Vue控制字符和字节的显示个数的示例
May 17 Javascript
node上的redis调用优化示例详解
Oct 30 Javascript
了解重排与重绘
May 29 Javascript
vue项目查看vue版本及cli版本的实现方式
Oct 24 Javascript
如何利用JavaScript实现二叉搜索树
Apr 02 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
Access数据库导入Mysql的方法之一
2006/10/09 PHP
PHP大小写问题:函数名和类名不区分,变量名区分
2013/06/17 PHP
常见的四种POST 提交数据方式(小总结)
2015/10/08 PHP
详解Yii实现分页的两种方法
2017/01/14 PHP
PHP实现通过strace定位故障原因的方法
2018/04/29 PHP
PHP通过调用新浪API生成t.cn格式短网址链接的方法详解
2019/02/20 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
自动检查并替换文本框内的字符
2006/06/30 Javascript
Javascript Function对象扩展之延时执行函数
2010/07/06 Javascript
鼠标滑上去后图片放大浮出效果的js代码
2011/05/28 Javascript
Knockoutjs的环境搭建教程
2012/11/26 Javascript
jquery中文乱码的多种解决方法
2013/06/21 Javascript
JavaScript获取table中某一列的值的方法
2014/05/06 Javascript
jQuery中 delegate使用的问题
2015/07/03 Javascript
jQuery判断浏览器并动态调整select宽度的方法
2016/03/02 Javascript
浅析jQuery Ajax通用js封装
2016/06/22 Javascript
JavaScript数组方法大全(推荐)
2016/07/05 Javascript
JS重载实现方法分析
2016/12/16 Javascript
详解vuex结合localstorage动态监听storage的变化
2018/05/03 Javascript
Swiper.js实现移动端元素左右滑动
2019/09/08 Javascript
微信小程序实现禁止分享代码实例
2019/10/19 Javascript
Layui数据表格判断编辑输入的值,是否为我需要的类型详解
2019/10/26 Javascript
python迭代器实例简析
2014/09/25 Python
详解python单元测试框架unittest
2018/07/02 Python
python图的深度优先和广度优先算法实例分析
2019/10/26 Python
Python基于百度AI实现OCR文字识别
2020/04/02 Python
10个很棒的 CSS3 开发工具 推荐
2011/05/16 HTML / CSS
CSS3实现菜单悬停效果
2020/11/17 HTML / CSS
英国电信商店:BT Shop
2019/12/17 全球购物
Steiff台湾官网:德国金耳釦泰迪熊
2019/12/26 全球购物
Deichmann英国:德国鞋类零售商
2021/01/30 全球购物
师范生的个人求职信范文
2014/01/04 职场文书
乔迁宴答谢词
2014/01/21 职场文书
违反交通法规检讨书
2014/09/10 职场文书
小学体育跳绳课教学反思
2016/02/16 职场文书
Go Gin实现文件上传下载的示例代码
2021/04/02 Golang