Object.defineProperty() —— 实现vue双向数据绑定的核心

       前言:vue是一个mvvm前端框架,数据(m)和视图(v)通过vm实现数据双向绑定,即数据的变化会反应到视图上,相反,视图的变化也会反应到视图上,其核心就是用到了Object.defineProperty()方法,其描述符的get和set对数据双向绑定起了关键性的作用,接下来详细进行介绍。

      1. 语法

       Object.defineProperty(obj, prop, descriptor)

       其中:

       obj —— 要在其上定义属性的对象

       prop —— 要定义或修改的属性的名称

       descriptor —— 将被定义或修改的属性描述符

       返回值:传递给函数的对象obj

      eg:这里给obj这个空对象定义了一个a属性,访问obj.a得到37

       var obj = {}

       Object.defineProperty(obj, 'a', {

           value: 37

       })

       2. 参数descriptor属性描述符

       descriptor包括数据描述符和存取描述符
       1)数据描述符具有的如下可选键值:

           value —— 该属性对应的值,默认值undefined

           writable —— 布尔值,当设置为true时,该属性的value才能被赋值运算符改变,默认false

       2)存储描述符具有的如下可选键值       

           get —— 一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。当访问该属性时,该方法会被执行

           set —— 一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。当属性值修改时,触发执行该方法

      3)数据描述符和存储描述符都具有的如下可选键值       

           configurable —— 当且仅当该属性的 configurable 为 true 时,该属性描述符才能够被改变,同时该属性也能从对应的对象上被删除。默认为 false。

           enumerable —— 当且仅当该属性的enumerabletrue时,该属性才能够出现在对象的枚举属性中,(for...in 或 Object.keys 方法是否可枚举)。默认为 false。

      4)注意事项

        如果一个描述符同时有(value或writable)和(get或set)关键字,将会产生一个异常

      eg:使用这些描述符

      var obj = {} 

      Object.defineProperty(obj, 'key', {

           configurable: true,    //可被修改

           enumerable : true,    //可被枚举

           writable : false,    //value键值不能被改变  obj.key = 38将抛出错误

           value: 37    //若同时具备get或set关键字,将会产生一个异常

       })

     3. 关于存储描述符的get和set

      var obj = {}; 

      Object.defineProperty(obj, 'a', {

           configurable: true,    //可被修改

           enumerable : true,    //可被遍历

           writable : true,    //value键值不能被改变  obj.key = 38将抛出错误

           value: 37

       });      // 特别地,若这几个键值都被设置为true,那么此时等价于var obj = {};   obj.a = 37;

       //此时在对象中同时添加一个属性b,使用存储描述符

       var bValue;

       Object.defineProperty(obj, 'b', {

          configurable: true,    //可被修改

          enumerable : true,    //可被遍历

          get: function () {

                 return bValue; 

          },

          set: function (newValue) {

                 bValue = newValue; 

          },

       })

       赋值: obj.b = 38,  之后对象obj的属性b的值时38

 4. 双向数据绑定案例,当在输入框中输入文本时,页面上会同步显示输入内容

       

      

      

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值