• Object.defineProperty方法(Vue 数据双向绑定原理)


    在学习了Vue的基本使用之后,对于vue框架中的双向数据绑定的实现原理还没了解过,今天看到Object.defineProperty方法后,了解到这个方法涉及到双向数据绑定原理。于是深入了解了一下,特来记录一下。

    Object.defineProperty(obj, propertyName, descriptor)

    • objpropertyName

    obj是应用描述符的对象,property是obj对象属性

    • descriptor

    descriptor可以是属性描述符对象,也可以是访问器描述符对象,这里只说访问器描述符,我们先看一下对象的访问器属性,它们本质上是用于获取和设置值的函数。访问器属性由‘getter’ 和 ‘setter’方法表示,在对象字面量中,用 get 和 set 表示。

    let obj = {// 当读取obj的name属性时,该方法起作用get name(){} // obj.name = value 当设置obj的name属性值时,该方法起作用set name(value) { }
    } 
    
    • 1
    • 2

    当我们调用 obj.name 时,实际是getter在运行

    访问器描述符

    在访问器描述符对象中,也有get和set方法,通过这两个方法设置对象的属性

    let person = {lastName: 'john',firstName: 'smith'
    }
    
    Object.defineProperty(person, 'fullName', {get() {return `${this.lastName} ${this.firstName}`},set(value) {[this.lastName, this.firstName] = value.split(' ')}
    })
    
    person.fullName = 'li yiyi' // 此时调用的是 set方法,'li yiyi'作为参数
    console.log(person.fullName); // 此时调用的是 get方法,打印的是 'li yiyi' 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    所以Object.defineProperty()可以很方便地改变对象的属性值,无论是读取对象的属性值还是设置对象的属性值,都会默认去调用它的get和set方法,利用这一点就可以去思考vue中数据双向绑定了。

    数据双向绑定

    我们先创建一个页面,通过input输入框输入值,同时让下面的div显示input输入内容

    思路

    • 获取input和div的dom元素
    • 给input元素添加监听器,触发input时间就将输入值存到数据中
    • 在将input输入值存到数据的同时,需要将数据显示到div中
    
    
    
    Document
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    最后

    最近还整理一份JavaScript与ES的笔记,一共25个重要的知识点,对每个知识点都进行了讲解和分析。能帮你快速掌握JavaScript与ES的相关知识,提升工作效率。



    有需要的小伙伴,可以点击下方卡片领取,无偿分享

  • 相关阅读:
    快速检测 GlassFish 任意文件读取漏洞的 Python 脚本
    5分钟——快速搭建后端springboot项目
    21、阿里云oss
    脑皮质算法(3)-- 新皮层的位置:利用皮层网格细胞的感觉运动物体识别理论
    数据库三级(3.大规模数据库架构)
    图像如何降噪?给图片降噪也可以很简单
    LAMMPS模拟中,明明是cu晶格,为什么在生成原子命令中,注释标注的却是添加第一类Fe原子。
    基于PHP+MySQL的动漫交流及动漫周边购物网站
    (附源码)springboot学生社团管理系统 毕业设计 151109
    [二分][状压dp]Boss Rush 2022杭电多校第3场 1002
  • 原文地址:https://blog.csdn.net/web2022050903/article/details/127500191