浅谈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 相关文章推荐
初识javascript 文档碎片
Jul 13 Javascript
javascript innerHTML使用分析
Dec 03 Javascript
jquery数据验证插件(自制,简单,练手)实例代码
Oct 24 Javascript
分享一个常用的javascript静态类
Dec 31 Javascript
jquery使用正则表达式验证email地址的方法
Jan 22 Javascript
详解javascript跨浏览器事件处理程序
Mar 27 Javascript
JavaScript手机振动API
Jun 11 Javascript
JQuery之proxy实现绑定代理方法
Aug 01 Javascript
js调用刷新界面的几种方式
May 03 Javascript
JS获取指定月份的天数两种实现方法
Jun 22 Javascript
vue 获取url参数、get参数返回数组的操作
Nov 12 Javascript
JS新手入门数组处理的实用方法汇总
Apr 07 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开发中常用的8个小技巧
2008/08/27 PHP
理解和运用PHP中的多态性[译]
2011/08/02 PHP
php中$_REQUEST、$_POST、$_GET的区别和联系小结
2011/11/23 PHP
CI框架常用方法小结
2016/05/17 PHP
jquery+thinkphp实现跨域抓取数据的方法
2016/10/15 PHP
PHP两个n位的二进制整数相加问题的解决
2018/08/26 PHP
Prototype使用指南之base.js
2007/01/10 Javascript
Javascript String对象扩展HTML编码和解码的方法
2009/06/02 Javascript
javascript forEach通用循环遍历方法
2010/10/11 Javascript
js加入收藏以及使用Jquery更改透明度
2014/01/26 Javascript
JavaScript调用ajax获取文本文件内容实现代码
2014/03/28 Javascript
使用JavaScript实现网页版Pongo设计思路及源代码分享
2014/06/16 Javascript
JavaScript中join()方法的使用简介
2015/06/09 Javascript
jQuery网页选项卡插件rTabs用法实例分析
2015/08/26 Javascript
Bootstrap每天必学之进度条
2015/11/30 Javascript
confirm确认对话框的实现方法总结
2016/06/17 Javascript
jquery通过name属性取值的简单实现方法
2016/06/20 Javascript
基于JavaScript实现图片连播和联级菜单实例代码
2017/07/28 Javascript
JavaScript实现三级级联特效
2017/11/05 Javascript
webpack项目调试以及独立打包配置文件的方法
2018/02/28 Javascript
Vue项目中如何引入icon图标
2018/03/28 Javascript
浅谈vue同一页面中拥有两个表单时,的验证问题
2018/09/18 Javascript
Vue实现固定定位图标滑动隐藏效果
2019/05/30 Javascript
vue中的过滤器实例代码详解
2019/06/06 Javascript
Python Sleep休眠函数使用简单实例
2015/02/02 Python
Python3.4实现远程控制电脑开关机
2018/02/22 Python
Python数据分析库pandas高级接口dt的使用详解
2020/12/11 Python
Python 利用argparse模块实现脚本命令行参数解析
2020/12/28 Python
python 列表推导和生成器表达式的使用
2021/02/01 Python
HTML5 transform三维立方体实现360无死角三维旋转效果
2014/08/22 HTML / CSS
中东地区最大的奢侈品市场:The Luxury Closet
2019/04/09 全球购物
主持人演讲稿范文
2013/12/28 职场文书
初中数学教学反思
2014/01/16 职场文书
小学庆六一活动方案
2014/02/28 职场文书
班级口号大全
2014/06/09 职场文书
大一学生个人总结
2015/02/15 职场文书