浅谈vue中数据双向绑定的实现原理

发布时间 - 2026-01-11 03:15:20    点击率:

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);

介绍完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实现双向数据绑定  # vue双向绑定实现原理  # vue双向绑定原理  # Vue数据双向绑定原理实例解析  # Vue的双向数据绑定实现原理解析  # 详解Vue双向数据绑定原理解析  # vue双向数据绑定原理探究(附demo)  # 深入了解Vue中双向数据绑定原理  # 它是  # 我们一起  # 定了  # 这两种  # 能与  # 绑定  # 最常见  # 大家多多  # 到该  # 如何实现  # 解下  # 很好奇  # 返回值  # 总结了  # arr  # console  # vue  # length  # configurable  # false 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: bootstrap日历插件datetimepicker使用方法  如何在云主机上快速搭建多站点网站?  打造顶配客厅影院,这份100寸电视推荐名单请查收  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  如何破解联通资金短缺导致的基站建设难题?  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  网站建设保证美观性,需要考虑的几点问题!  Laravel中的Facade(门面)到底是什么原理  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  网站制作软件免费下载安装,有哪些免费下载的软件网站?  如何用虚拟主机快速搭建网站?详细步骤解析  JavaScript如何实现继承_有哪些常用方法  佛山企业网站制作公司有哪些,沟通100网上服务官网?  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  Python3.6正式版新特性预览  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  python中快速进行多个字符替换的方法小结  如何在阿里云通过域名搭建网站?  Laravel用户密码怎么加密_Laravel Hash门面使用教程  在centOS 7安装mysql 5.7的详细教程  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  Android利用动画实现背景逐渐变暗  详解Oracle修改字段类型方法总结  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  Laravel如何使用Sanctum进行API认证?(SPA实战)  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  智能起名网站制作软件有哪些,制作logo的软件?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  成都网站制作公司哪家好,四川省职工服务网是做什么用?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  Laravel如何处理CORS跨域请求?(配置示例)  如何基于云服务器快速搭建网站及云盘系统?  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  如何快速查询域名建站关键信息?  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  Laravel怎么在Blade中安全地输出原始HTML内容  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  Laravel如何实现数据库事务?(DB Facade示例)  如何在云指建站中生成FTP站点?  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  如何自定义建站之星网站的导航菜单样式?  JavaScript数据类型有哪些_如何准确判断一个变量的类型  Laravel如何配置和使用缓存?(Redis代码示例)