浅谈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 相关文章推荐
ASP 过滤数组重复数据函数(加强版)
May 31 Javascript
JS仿flash上传头像效果实现代码
Jul 18 Javascript
探讨js字符串数组拼接的性能问题
Oct 11 Javascript
整理Javascript数组学习笔记
Nov 29 Javascript
js中获取 table节点各tr及td的内容简单实例
Oct 14 Javascript
js手机号4位显示空格,银行卡每4位显示空格效果
Mar 23 Javascript
AngularJS select加载数据选中默认值的方法
Feb 28 Javascript
vue 循环加载数据并获取第一条记录的方法
Sep 26 Javascript
Vue源码解析之数组变异的实现
Dec 04 Javascript
node.js开发辅助工具nodemon安装与配置详解
Feb 06 Javascript
JavaScript中break、continue和return的用法区别实例分析
Mar 02 Javascript
详解阿里Node.js技术文档之process模块学习指南
Jan 04 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
非常不错的MySQL优化的8条经验
2008/03/24 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
实例讲解PHP中使用命名空间
2019/01/27 PHP
jQuery学习笔记之jQuery动画效果
2013/09/09 Javascript
js禁止页面使用右键(简单示例代码)
2013/11/13 Javascript
JavaScript SetInterval与setTimeout使用方法详解
2013/11/15 Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
2013/12/16 Javascript
jQuery中复合属性选择器用法实例
2014/12/31 Javascript
Jquery实现鼠标移动放大图片功能实例
2015/03/25 Javascript
基于jQuery Circlr插件实现产品图片360度旋转
2015/09/20 Javascript
基于Bootstrap使用jQuery实现输入框组input-group的添加与删除
2016/05/03 Javascript
javascript日期比较方法实例分析
2016/06/17 Javascript
js正则表达式注册页面表单验证
2016/10/11 Javascript
Node.js中.pfx后缀文件的处理方法
2017/03/10 Javascript
vue-router中scrollBehavior的巧妙用法
2018/07/09 Javascript
Vue3.0结合bootstrap创建多页面应用
2019/05/28 Javascript
JavaScript写个贪吃蛇小游戏(超详细)
2020/03/17 Javascript
Vue+ElementUI 中级联选择器Bug问题的解决
2020/07/31 Javascript
vue项目查看vue版本及cli版本的实现方式
2020/10/24 Javascript
用python代码做configure文件
2014/07/20 Python
Python单元测试简单示例
2018/07/03 Python
python实现Excel文件转换为TXT文件
2019/04/28 Python
Python 实现还原已撤回的微信消息
2019/06/18 Python
Python爬取破解无线网络wifi密码过程解析
2019/09/17 Python
Python 异常处理Ⅳ过程图解
2019/10/18 Python
Python3+Flask安装使用教程详解
2021/02/16 Python
使用CSS3的rem属性制作响应式页面布局的要点解析
2016/05/24 HTML / CSS
Pretty You London官网:英国拖鞋和睡衣品牌
2019/05/08 全球购物
中国制造网:Made-in-China.com
2019/10/25 全球购物
Big Green Smile法国:领先的英国有机和天然产品在线商店
2021/01/02 全球购物
C/C++有关内存的思考题
2015/12/04 面试题
新店开张活动方案
2014/08/24 职场文书
孝敬父母的活动方案
2014/08/28 职场文书
学校办公室主任岗位职责
2015/04/01 职场文书
让人感觉高大上的讲话稿怎么写?
2019/07/08 职场文书
使用python向MongoDB插入时间字段的操作
2021/05/18 Python