浅谈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天然的迭代器
Oct 29 Javascript
JavaScript获取多个数组的交集简单实例
Nov 11 Javascript
js动态添加删除,后台取数据(示例代码)
Nov 25 Javascript
JS 仿腾讯发表微博的效果代码
Dec 25 Javascript
学习JavaScript设计模式(继承)
Nov 26 Javascript
原生js实现打字动画游戏
Feb 04 Javascript
Vue实现一个返回顶部backToTop组件
Jul 25 Javascript
js实现轮播图的两种方式(构造函数、面向对象)
Sep 30 Javascript
JS实现导出Excel的五种方法详解【附源码下载】
Mar 15 Javascript
swiper在vue项目中loop循环轮播失效的解决方法
Sep 15 Javascript
使用原生JS实现火锅点餐小程序(面向对象思想)
Dec 10 Javascript
vue实现把接口单独存放在一个文件方式
Aug 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读取MySQL数据代码
2008/06/05 PHP
封装ThinkPHP的一个文件上传方法实例
2014/10/31 PHP
PHP数组中头部和尾部添加元素的方法(array_unshift,array_push)
2017/04/10 PHP
JS动态添加与删除select中的Option对象(示例代码)
2013/12/25 Javascript
JavaScript判断变量是否为空的自定义函数分享
2015/01/31 Javascript
原生js配合cookie制作保存路径的拖拽
2015/12/29 Javascript
JavaScript数据结构与算法之集合(Set)
2016/01/29 Javascript
Ionic2开发环境搭建教程
2020/08/20 Javascript
详解webpack+vue-cli项目打包技巧
2017/06/17 Javascript
Vue插值、表达式、分隔符、指令知识小结
2018/10/12 Javascript
微信小程序中遇到的iOS兼容性问题小结
2018/11/14 Javascript
layui动态渲染生成左侧3级菜单的方法(根据后台返回数据)
2019/09/23 Javascript
js仿淘宝放大镜效果
2020/12/28 Javascript
[44:40]Serenity vs Pain 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python中使用logging模块代替print(logging简明指南)
2014/07/09 Python
Python的GUI框架PySide的安装配置教程
2016/02/16 Python
对Python 3.5拼接列表的新语法详解
2018/11/08 Python
Python多线程应用于自动化测试操作示例
2018/12/06 Python
在Pycharm中自动添加时间日期作者等信息的方法
2019/01/16 Python
python库matplotlib绘制坐标图
2019/10/18 Python
利用pytorch实现对CIFAR-10数据集的分类
2020/01/14 Python
Python基于requests实现模拟上传文件
2020/04/21 Python
Python使用Chrome插件实现爬虫过程图解
2020/06/09 Python
基于Python爬取fofa网页端数据过程解析
2020/07/13 Python
深入了解canvas在移动端绘制模糊的问题解决
2019/04/30 HTML / CSS
去加拿大的旅行和假期:Canadian Affair
2016/10/25 全球购物
斯图尔特·韦茨曼鞋加拿大官网:Stuart Weitzman加拿大
2019/10/13 全球购物
Discard Protocol抛弃协议的作用是什么
2015/10/10 面试题
万年牢教学反思
2014/02/15 职场文书
高中语文课后反思
2014/04/27 职场文书
企业法人代表任命书
2014/06/06 职场文书
销售顾问工作计划书
2014/08/15 职场文书
群教班子对照检查材料
2014/08/26 职场文书
幼儿园教师教学反思
2016/03/02 职场文书
python爬取新闻门户网站的示例
2021/04/25 Python
开机音效回归! Windows 11重新引入开机铃声
2021/11/21 数码科技