美文网首页Web前端之路
11 - 动态数据绑定实现原理

11 - 动态数据绑定实现原理

作者: 大大的小小小心愿 | 来源:发表于2018-10-15 15:51 被阅读5次
vue 的动态数据绑定,是利用 ES5 的对象的
Object.defineProperty() 的方法 [定义属性],中的get 和set方法

一、defineProperty 基本用法

1、基本写法:
    var person= {};
    Object.defineProperty(person, "name", {
    value: '张三',
    })
    console.log(person.name); // 打印:张三
2、参数
一、参数
        第一个参数:要设置的目标对象(必填)
        第二个参数:需要定义的属性或方法的名称(必填)
        第三个参数:目标属性所拥有的特性,对象。(descriptor)(必填)

二、关于 descriptor 的属性:
         value: 属性的值
         writable:是否可写 -- 如果为false,属性的值就不能被重写, 只能为只读了
         configurable:总开关,一旦为false,就不能再设置他的(value,writable,configurable)
         enumerable:是否可枚举(是否能在for...in循环中遍历出来或在Object.keys中列举出来)
         set:改变值
         get:获取值
3、descriptor 参数的基本用法

1、默认值

writable、configurable、enumerable:默认值为 false

2、configurable

configurable:第一次设置 false后,
再次通过 defineProperty 设置其他值(value,writable,configurable)就会报错。
    var person= {};
    Object.defineProperty(person, "name", {
    value: '张三',
    configurable:false
    })

    Object.defineProperty(person, "name", {
    value: '李四',
    })
报错.png

3、writable

writable:设置false后,变为只读。
    var person= {};
    Object.defineProperty(person, "name", {
    value: '张三',
    configurable:false
    })
    console.log(person.name); // 打印:张三
    person.name = "李四";     // 没有错误抛出(在严格模式下会抛出,即使之前已经有相同的值)
    console.log(person.name)  // 打印:张三,赋值不起作用。

4、enumerable

enumerable:是否可枚举
(是否能在for...in循环中遍历出来或在Object.keys中列举出来)
    var person = {}; 
    Object.defineProperty(person, "name", { 
          value : '张三',
          enumerable: true
      }
    );
    console.log(Object.keys(person)); // true:打印 ["name"];  false:打印 []

5、get、set

1、set :更新数据;set:获取数据

2、在 descriptor 中不能同时设置访问器(get 和 set)和 wriable 或 value,否则会错,
  就是说想用 get 和 set,就不能用 writable 或 value 中的任何一个。

3、简单来说,赋值或者取值的时候会分别触发 set 和 get 对应的函数。
    var person= {};
    var temp = [];
    Object.defineProperty(person, 'name', {
    set: function(newVal) {
        temp['name'] = newVal;
        console.log('为person设置新的姓名:' + newVal);
    },
    get: function() {
        var _name =  temp['name'] || '默认姓名';
        console.log('获取person的姓名:' +  _name);
        return _name;
    }
    });
    person.name = '张三';      // 打印 获取person的姓名:张三
    console.log(person.name)  // 打印 获取person的姓名:张三(如果不设置name,这里会打印'默认姓名')
4、get 、set 动态绑定数据的例子:
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>vue</title>
</head>
<body>
<input type="text" id="changeDemo">
<p id="getData"></p>
<script>
    var obj={};
    var dataArr=[];
    //触发obj对象set和get方法的时候,趁机来输出或修改dataArr数组的内容
    Object.defineProperty(obj,'name',{
        // 改变值
        set:function(val){
            dataArr['name']=val;
        },
        // 获取值
        get:function(){
            return dataArr['name'];
        }
    })
    var changeDemo=document.querySelector('#changeDemo');   
    var getData=document.querySelector('#getData');
    /*
        keyup 事件:
        1、拿到 input value 的值,赋给 obj;
           赋值时会触发 obj 的 set 方法:改变数组对应的下标值
        2、将数组的值 在页面动态展示
    */ 
    changeDemo.onkeyup=function(){
        obj['name']=changeDemo.value;      // 1
        getData.innerHTML=dataArr['name']; // 2
        console.log(dataArr)
    }
</script>
</body>
</html>

参考链接:
https://www.cnblogs.com/lvmylife/p/7474374.html
https://blog.csdn.net/u014787301/article/details/52083218

相关文章

  • 11 - 动态数据绑定实现原理

    一、defineProperty 基本用法 1、基本写法: 2、参数 3、descriptor 参数的基本用法 1...

  • vue 双向数据绑定

    Vue实现数据双向绑定的原理:Object.defineProperty()vue实现数据双向绑定主要是:采用数据...

  • 【转】JavaScript的观察者模式(Vue双向绑定原理)

    关于Vue实现数据双向绑定的原理,请点击:Vue实现数据双向绑定的原理原文链接:JavaScript设计模式之观察...

  • 深入Vue响应式原理

    1.Vue的双向数据绑定 参考 vue的双向绑定原理及实现Vue双向绑定的实现原理Object.definepro...

  • Vue实现数据双向绑定的原理

    Vue实现数据双向绑定的原理:Object.defineProperty() vue实现数据双向绑定主要是:采用数...

  • 前端理论面试--VUE

    vue双向绑定的原理(详细链接) VUE实现双向数据绑定的原理就是利用了 Object.definePropert...

  • vue面试知识点

    vue 数据双向绑定原理 vue实现数据双向绑定原理主要是:采用数据劫持结合发布订阅设计模式的方式,通过对data...

  • vue双向数据绑定

    剖析Vue原理、实现双向绑定MVVM 几种实现双向绑定的做法 目前几种主流的mvc(vm)框架都实现了单向数据绑定...

  • Vue双向数据绑定原理

    剖析Vue实现原理 - 如何实现双向绑定mvvm 本文能帮你做什么?1、了解vue的双向数据绑定原理以及核心代码模...

  • 关于双向绑定的问题

    剖析Vue实现原理 - 如何实现双向绑定mvvm 本文能帮你做什么?1、了解vue的双向数据绑定原理以及核心代码模...

网友评论

    本文标题:11 - 动态数据绑定实现原理

    本文链接:https://www.haomeiwen.com/subject/expfzftx.html