VUE实现双向数据绑定的原理就是利用了 Object.defineProperty() 这个方法重新定义了对象获取属性值(get)和设置属性值(set)的操作来实现的。那么Object.defineProperty究竟是该如何使用的呢?先看个例子

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
</head><body><div id="app"><h5 id="txtShow"></h5><input type="text" id="txt"></div><script>// mvvm 分为model(模型) view(视图) viewModel(视图模型)//  model 用来存储数据//  view  用来展示数据//  ViewModel 关联数据,和model实现双向绑定。// 通过Object.defineProperty 定义一个属性//  通过此方法为对象设置属性的时候 对象的属性值会包含一个get和set方法//  当修改对象值得时候回触发相应的函数调用//  参数一 需要定义属性的对象//  参数二 属性名字//  参数三 对象属性的修饰内容 //    在set方法中做一些处理,执行页面的刷新和回调var model = {}; //创建一个新对象var vm = '';Object.defineProperty(model, 'txt', {set: function (val) {console.log('设置属性值');console.log(val);vm = val;txtShow.innerHTML = this.txt;},get: function () {console.log('获取属性值');console.log(this);return vm;},enumerable: true, //可枚举,默认falseconfigurable: true //该属性描述符能够被改变,同时该属性也能从对应的对象上被删除。默认false
    })var txtShow = document.getElementById('txtShow'),txt = document.getElementById('txt');txt.onkeyup = function () {if (event.keyCode == 13) {model.txt = txt.value;}}</script>
</body></html>

  通过上面的代码我们可以看到,在控制台,无论是改变vm的值还是model.txt的值,所对应的的,对方的值也会相应的改变,由此,这里我们就实现了双向绑定。

  对于Object.defineProperty() ,大家应该都见过,只是认知的程度有所不同。

  根据MDN web docs 中解释说: Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。

语法

Object.defineProperty(obj, prop, descriptor)

参数

obj
要在其上定义属性的对象。
prop
要定义或修改的属性的名称。
descriptor
将被定义或修改的属性描述符。

返回值

被传递给函数的对象。

  该方法允许精确添加或修改对象的属性。通过赋值操作添加的普通属性是可枚举的,能够在属性枚举期间呈现出来(for...in 或 Object.keys 方法), 这些属性的值可以被改变,也可以被删除。这个方法允许修改默认的额外选项(或配置)。默认情况下,使用 Object.defineProperty() 添加的属性值是不可修改的。

  

  对象里目前存在的属性描述符有两种主要形式:数据描述符存取描述符数据描述符是一个具有值的属性,该值可能是可写的,也可能不是可写的。存取描述符是由getter-setter函数对描述的属性。描述符必须是这两种形式之一;不能同时是两者。

  数据描述符和存取描述符均具有以下可选键值:

configurable
当且仅当该属性的 configurable 为 true 时,该属性描述符才能够被改变,同时该属性也能从对应的对象上被删除。默认为 falseconfigurable特性表示对象的属性是否可以被删除,以及除valuewritable特性外的其他特性是否可以被修改。
enumerable
当且仅当该属性的enumerabletrue时,该属性才能够出现在对象的枚举属性中。默认为 falseenumerable定义了对象的属性是否可以在 for...in 循环和 Object.keys() 中被枚举。

数据描述符同时具有以下可选键值

value
该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefined
writable
当且仅当该属性的writabletrue时,value才能被赋值运算符改变。默认为 false

存取描述符同时具有以下可选键值

get
一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。当访问该属性时,该方法会被执行,方法执行时没有参数传入,但是会传入this对象(由于继承关系,这里的this并不一定是定义该属性的对象)。
默认为 undefined
set
一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。当属性值修改时,触发执行该方法。该方法将接受唯一参数,即该属性新的参数值。
默认为 undefined
描述符可同时具有的键值
   configurable  enumerable  value writable  get   set
数据描述符  YES  YES  YES  YES  NO  NO
存取描述符  YES  YES  NO  NO  YES  YES

  如果一个描述符不具有value,writable,get 和 set 任意一个关键字,那么它将被认为是一个数据描述符。如果一个描述符同时有(value或writable)和(get或set)关键字,将会产生一个异常。

  记住,这些选项不一定是自身属性,如果是继承来的也要考虑。为了确认保留这些默认值,你可能要在这之前冻结 Object.prototype,明确指定所有的选项,或者通过 Object.create(null)__proto__属性指向null

  在日常运用中,那你需要明白:

var o = {};o.a = 1;
// 等同于 :
Object.defineProperty(o, "a", {value : 1,writable : true,configurable : true,enumerable : true
});// 另一方面,
Object.defineProperty(o, "a", { value : 1 });
// 等同于 :
Object.defineProperty(o, "a", {value : 1,writable : false,configurable : false,enumerable : false
});

  

下面的例子展示了如何实现一个自存档对象。 当设置temperature 属性时,archive 数组会获取日志条目。

function Archiver() {var temperature = null;var archive = [];Object.defineProperty(this, 'temperature', {get: function() {console.log('get!');return temperature;},set: function(value) {temperature = value;archive.push({ val: temperature });}});this.getArchive = function() { return archive; };
}var arc = new Archiver();
arc.temperature; // 'get!'
arc.temperature = 11;
arc.temperature = 13;
arc.getArchive(); // [{ val: 11 }, { val: 13 }]

  看到这个例子,你心中是不是有了些许想法?

  后面还有很多知识点,有需要的可以去MDN进行更加深入的了解,谢谢!

  

转载于:https://www.cnblogs.com/gitByLegend/p/10553793.html

浅谈Vue之双向绑定相关推荐

  1. 浅谈vue 之双向绑定和响应式(vue的响应式)

    初识vue小伙伴通常都会被他的双向绑定所感叹,神奇?方便?而且在不少的面试中也会被面试官问到,上来就是:请问vue双向绑定的原来是什么?我们就来研究研究这是个什么东西: v-model 官方其实已经说 ...

  2. 浅谈Vue.js的优势

    写在前面 今天小梦跟小伙伴们简简单单聊一下Vue.js的优势.小梦也是刚刚接触Vue.js,在学习一门新的技术之前,我们当然要了解其优势,知道优势在哪更加有利于我们去学习并转换为自己的储备. 浅谈Vu ...

  3. vue 给checkbox 赋值_浅谈vue中关于checkbox数据绑定v-model指令的个人理解

    vue.js为开发者提供了很多便利的指令,其中v-model用于表单的数据绑定很常见, 下面是最常见的例子: {{msg}} js里data初始化数据 new Vue({ el: "#myA ...

  4. 西安电话面试:谈谈Vue数据双向绑定原理,看看你的回答能打几分

    最近我参加了一次来自西安的电话面试(第二轮,技术面),是大厂还是小作坊我在这里按下不表,先来说说这次电面给我留下印象较深的几道面试题,这次先来谈谈Vue的数据双向绑定原理. 情景再现: 当我手机铃声响 ...

  5. vue数据双向绑定的原理

    vue数据双向绑定的原理 一 复习闭包 1 闭包含义: 当函数嵌套时,内部函数使用了外部函数的变量,就会产生闭包 当函数可以记住并访问自己的作用域时,就会产生闭包 2 闭包注意点 ① 队列里的代码执行 ...

  6. Vue.js双向绑定的实现原理

    Vue.js 最核心的功能有两个,一是响应式的数据绑定系统,二是组件系统.本文仅探究双向绑定是怎样实现的.先讲涉及的知识点,再用简化得不能再简化的代码实现一个简单的 hello world 示例. 一 ...

  7. 小猿圈解析vue数据双向绑定的缺点

    vue是当今前端很流行的一种框架,但是vue也是有一定的缺陷的,你有过了解吗?下面小猿圈web前端老师就为你解析一下vue数据双向绑定的缺陷,希望对你有所帮助,下面我们一起了解一下吧. 1.vue 实 ...

  8. Vue Angular 双向绑定检测不到对象属性的添加和删除

    由于ES5的限制 Vue  && Angular 双向绑定检测不到对象属性的添加和删除  还有数组增加索引.这些改变不会触发change事件.Vue是因为实例化的时候已经把各个属性都s ...

  9. 浅谈vue,小程序,react基础绑定值

    最近一直在用react开发项目,碰见的问题千千万,很多,但是都殊途同源,唯一区别大的就是没有像vue的双向绑定,也没有小程序的单向方便,比如: vue   v-modal="msg" ...

最新文章

  1. 使用Blender Houdini轻松学习FX特效
  2. tomcat使用自签名证书实现https加密访问
  3. 我插计算机英语,帮我翻译以下计算机英语的句子
  4. 低智商屌丝蒟蒻的2012成都题解
  5. 感知机(Perceptron)为什么不能表示异或(XOR)
  6. java web教程下载_Java Web云应用开发项目式教程 中文pdf扫描版[208MB]
  7. 单片机电子时钟设计(期末课程设计)
  8. Windows XP DOS命令大全
  9. UVALive - 6437题解
  10. 免费且快速搭建个人www服务器的教程
  11. 面试官:说说如何打破或违反双亲委派!
  12. Best practices for a new Go developer
  13. docker使用docker compose file部署项目时,实现容器卷挂载,并对容器内文件夹赋予权限
  14. Github优秀Android开源项目,值得引用与学习(图文结合~~~)
  15. 基于MATLAB编写的GNSS_SDR(GNSS软件接收机)——自学笔记(3)
  16. tf.strided_slice函数
  17. 网络打印服务器记录打印文件,使用 CNAME 记录合并打印服务器 - Windows Server | Microsoft Docs...
  18. icon图标网站分享,设计师必备收藏
  19. python添加趋势线
  20. 环境变量与命令行参数

热门文章

  1. [蓝桥杯][算法提高VIP]数的划分(记忆化搜索)
  2. Quadratic equation(二次剩余)2019牛客多校第九场
  3. php 段落加上标签,php – 如何在段落中添加ReadMore
  4. 【计算机组成原理】多功能算数逻辑运算单元
  5. openshift4离线部署_OpenShift 4.2 离线安装补充记录
  6. arcgis select by attributes一次选多个_地理工具学习--arcgis篇:单工具学习(2)
  7. 深度学习之生成对抗网络(6)GAN训练难题
  8. 用于安装python第三方库的工具是_Python第三方库安装
  9. 数学--数论--同余及其性质(超详细)
  10. 整合Struts2、Spring、Hibernate构建J2EE应用