浅谈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 相关文章推荐
区分JS中的undefined,null,&quot;&quot;,0和false
Mar 08 Javascript
js实现简单的购物车有图有代码
May 26 Javascript
JavaScript实现获取dom中class的方法
Feb 09 Javascript
JavaScript实现的encode64加密算法实例分析
Apr 15 Javascript
使用JavaScript解决网页图片拉伸问题(推荐)
Nov 25 Javascript
使用Require.js封装原生js轮播图的实现代码
Jun 15 Javascript
Angular HMR(热模块替换)功能实现方法
Apr 04 Javascript
vue+element模态框中新增模态框和删除功能
Jun 11 Javascript
Vue如何获取数据列表展示
Dec 11 Javascript
支付宝小程序实现省市区三级联动
Jun 21 Javascript
带你使用webpack快速构建web项目的方法
Nov 12 Javascript
vue点击Dashboard不同内容 跳转到同一表格的实例
Nov 13 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图形计数器程序显示网站用户浏览量
2016/07/20 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
脚本收藏iframe
2006/07/21 Javascript
通过JAVASCRIPT读取ASP设定的COOKIE
2006/11/24 Javascript
javascript String 的扩展方法集合
2008/06/01 Javascript
jQuery之自动完成组件的深入解析
2013/06/19 Javascript
jQuery获取和设置表单元素的方法
2014/02/14 Javascript
jQuery实现首页图片淡入淡出效果的方法
2015/06/10 Javascript
javascript瀑布流布局实现方法详解
2016/02/17 Javascript
JS组件Bootstrap Select2使用方法解析
2016/05/30 Javascript
基于jQuery实现表格的查看修改删除
2016/08/01 Javascript
浅谈angular懒加载的一些坑
2016/08/20 Javascript
vue如何实现observer和watcher源码解析
2017/03/09 Javascript
JS点击缩略图整屏居中放大图片效果
2017/07/04 Javascript
分析javascript中9 个常见错误阻碍你进步
2017/09/18 Javascript
nodejs中方法和模块用法示例
2018/12/24 NodeJs
JS 数组和对象的深拷贝操作示例
2020/06/06 Javascript
如何封装Vue Element的table表格组件
2021/02/06 Vue.js
[51:07]VGJ.S vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
[01:02:05]LGD vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[46:47]完美世界DOTA2联赛PWL S2 FTD vs Magma 第二场 11.20
2020/11/23 DOTA
python获取指定网页上所有超链接的方法
2015/04/04 Python
Python简单删除目录下文件以及文件夹的方法
2015/05/27 Python
Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法
2017/09/08 Python
深入理解Django中内置的用户认证
2017/10/06 Python
对Pytorch中nn.ModuleList 和 nn.Sequential详解
2019/08/18 Python
Django Admin 上传文件到七牛云的示例代码
2020/06/20 Python
matplotlib制作雷达图报错ValueError的实现
2021/01/05 Python
html5指南-5.使用web storage存储键值对的数据
2013/01/07 HTML / CSS
html5的pushstate以及监听浏览器返回事件的实现
2020/08/11 HTML / CSS
电子商务毕业生求职信
2013/11/10 职场文书
超市后勤自我鉴定
2014/01/17 职场文书
优秀共产党员先进事迹
2014/01/27 职场文书
一帮一活动总结
2014/05/08 职场文书
党员承诺书范文2015
2015/04/27 职场文书
七年级语文教学反思
2016/03/03 职场文书