vue双向数据绑定的原理「建议收藏」

vue双向数据绑定的原理「建议收藏」有关双向数据绑定的原理最近两次面试的时候,被问到了vue中双向数据绑定的原理,因为初学不精,只是使用而没有深入研究,所以答不出来。之后就在网上查找了别人写的博客,学习一下。下面是博客园一篇博客,以及MDN上讲解Object.defineProperty()方法的地址。文章链接:vue的双向绑定原理及实现Mozilla开发者服务:Object.defineProperty…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

有关双向数据绑定的原理

最近两次面试的时候,被问到了vue中双向数据绑定的原理,因为初学不精,只是使用而没有深入研究,所以答不出来。之后就在网上查找了别人写的博客,学习一下。

下面是博客园一篇博客,以及MDN上讲解Object.defineProperty()方法的地址。

文章链接:vue的双向绑定原理及实现
Mozilla 开发者服务:Object.defineProperty()

因为内容比较长,就不转载了,只贴个连接在这里,有兴趣的可以直接点击链接访问。

这里简单说一下个人的理解。

vue实现双向数据绑定的原理就是利用了 Object.defineProperty() 这个方法重新定义了对象获取属性值(get)和设置属性值(set)的操作来实现的。

在MDN上对该方法的说明是:Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。

它接收三个参数,要操作的对象,要定义或修改的对象属性名,属性描述符。重点就是最后的属性描述符。

属性描述符是一个对象,主要有两种形式:数据描述符和存取描述符。这两种对象只能选择一种使用,不能混合两种描述符的属性同时使用。上面说的get和set就是属于存取描述符对象的属性。

然后我们可以通过在存取描述符中的get和set方法内写入自定义的逻辑来实现对象获取属性和设置属性时的行为。

var keyValue = 1;
var obj = {};
Object.defineProperty(obj,'key', {
    enumerable: true,
    configurable: true,
    get: function(){ 
   
        return keyValue;
    },
    set: function(newValue){ 
   
        keyValue = newValue;
        console.log(`keyValue的值已发生改变,目前的值是:${keyValue}`);
    }
});

obj.key; // 1

obj.key = 'obj对象的key属性已经绑定了变量keyValue的值';
// keyValue的值已发生改变,目前的值是:obj对象的key属性已经绑定了变量keyValue的值
// "obj对象的key属性已经绑定了变量keyValue的值"

keyValue; // "obj对象的key属性已经绑定了变量keyValue的值"

上面这个例子就是改变了对象获取属性及设置属性的默认行为。

对象obj获取属性key的值时,会触发上面的get方法,得到的是变量keyValue的值,然后当重新设置key的值时,触发set方法,会将变量keyValue的值改变为设置的值,如此就实现了一个简单的双向绑定:改变keyValue,obj.key得到的值也会改变,重新设置obj.key,keyValue一样会随之改变。

当然,vue的双向绑定实际更复杂,但最基本的原理就是基于Object.defineProperty()方法改变数据存取的默认行为来实现的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/180998.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 面试官:说一下Redis和MongoDB的区别?[通俗易懂]

    面试官:说一下Redis和MongoDB的区别?

  • intellij idea破解2019(2019年科目二考试全过程视频)

    本来看网上已经有写的不错的教程,结果用起来的时候发现有一些问题,首先是版本号的问题,另外是文件路径问题,还有就是碰到的修改hosts没有权限问题,还是想着记录一下,方便需要的童鞋使用。如果发现什么问题,请及时联系我。本文参考自:https://www.jianshu.com/p/3c87487e7121https://blog.csdn.net/qq_17213067/article/de…

  • Python-matplotlib画图(莫烦笔记)

    https://www.zhihu.com/collection/260736383<此处就不自己写了,看了遍,照着写了一边,作者写的不错。不过有些有些偷懒,我只做了常见的功能>作者:触摸壹缕阳光链接:https://zhuanlan.zhihu.com/p/33270402来源:知乎著作权归作者所有,转载请联系作者获得授权。1.前言Matplotlib是一个python的2D绘图库…

  • jquery判断数组中是否包含某个元素的值_java判断元素是否在数组中

    jquery判断数组中是否包含某个元素的值_java判断元素是否在数组中$.inArray(“元素字符串”,数组名称);vararry=[“C#”,”html”,”css”,”JavaScript”];varresult=$.inArray(“C#”,arry);如果arry数组里面存在”C#”这个字符串则返回该字符串的数组下标,否则返回(不包含在数组中)-1…

    2022年10月18日
  • 使用Windows PE的U盘安装win7

    前年刚去公司的时候用PE装过好多系统,最近又装一台华硕的,碰到了一个问题,一起记录了下。华硕X45,Bios已经改为U盘启动了,但就是进不去,因为知道可能还有个选磁盘启动项的键,找了半天原来按Esc就

    2021年12月21日
  • Spring Cloud核心组件详解

    Spring Cloud核心组件详解一、SpringCloud核心组件:Eureka(1)NetflixEureka1)、Eureka服务端:也称服务注册中心,同其他服务注册中心一样,支持高可用配置。如果Eureka以集群模式部署,当集群中有分片出现故障时,那么Eureka就转入自我保护模式。它允许在分片故障期间继续提供服务的发现和注册,当故障分片恢复运行时,集群中其他分片会把它们的状态再次同步回来2)、Eureka客户端…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号