浅谈Vue之双向绑定
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 时,该属性
描述符
才能够被改变,同时该属性也能从对应的对象上被删除。默认为 false。configurable
特性表示对象的属性是否可以被删除,以及除value
和writable
特性外的其他特性是否可以被修改。 -
enumerable
-
当且仅当该属性的
enumerable
为true
时,该属性才能够出现在对象的枚举属性中。默认为 false。enumerable
定义了对象的属性是否可以在for...in
循环和Object.keys()
中被枚举。 -
数据描述符同时具有以下可选键值:
-
value
-
该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为
undefined
。 -
writable
-
当且仅当该属性的
writable
为true
时,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之双向绑定相关推荐
- 浅谈vue 之双向绑定和响应式(vue的响应式)
初识vue小伙伴通常都会被他的双向绑定所感叹,神奇?方便?而且在不少的面试中也会被面试官问到,上来就是:请问vue双向绑定的原来是什么?我们就来研究研究这是个什么东西: v-model 官方其实已经说 ...
- 浅谈Vue.js的优势
写在前面 今天小梦跟小伙伴们简简单单聊一下Vue.js的优势.小梦也是刚刚接触Vue.js,在学习一门新的技术之前,我们当然要了解其优势,知道优势在哪更加有利于我们去学习并转换为自己的储备. 浅谈Vu ...
- vue 给checkbox 赋值_浅谈vue中关于checkbox数据绑定v-model指令的个人理解
vue.js为开发者提供了很多便利的指令,其中v-model用于表单的数据绑定很常见, 下面是最常见的例子: {{msg}} js里data初始化数据 new Vue({ el: "#myA ...
- 西安电话面试:谈谈Vue数据双向绑定原理,看看你的回答能打几分
最近我参加了一次来自西安的电话面试(第二轮,技术面),是大厂还是小作坊我在这里按下不表,先来说说这次电面给我留下印象较深的几道面试题,这次先来谈谈Vue的数据双向绑定原理. 情景再现: 当我手机铃声响 ...
- vue数据双向绑定的原理
vue数据双向绑定的原理 一 复习闭包 1 闭包含义: 当函数嵌套时,内部函数使用了外部函数的变量,就会产生闭包 当函数可以记住并访问自己的作用域时,就会产生闭包 2 闭包注意点 ① 队列里的代码执行 ...
- Vue.js双向绑定的实现原理
Vue.js 最核心的功能有两个,一是响应式的数据绑定系统,二是组件系统.本文仅探究双向绑定是怎样实现的.先讲涉及的知识点,再用简化得不能再简化的代码实现一个简单的 hello world 示例. 一 ...
- 小猿圈解析vue数据双向绑定的缺点
vue是当今前端很流行的一种框架,但是vue也是有一定的缺陷的,你有过了解吗?下面小猿圈web前端老师就为你解析一下vue数据双向绑定的缺陷,希望对你有所帮助,下面我们一起了解一下吧. 1.vue 实 ...
- Vue Angular 双向绑定检测不到对象属性的添加和删除
由于ES5的限制 Vue && Angular 双向绑定检测不到对象属性的添加和删除 还有数组增加索引.这些改变不会触发change事件.Vue是因为实例化的时候已经把各个属性都s ...
- 浅谈vue,小程序,react基础绑定值
最近一直在用react开发项目,碰见的问题千千万,很多,但是都殊途同源,唯一区别大的就是没有像vue的双向绑定,也没有小程序的单向方便,比如: vue v-modal="msg" ...
最新文章
- 使用Blender Houdini轻松学习FX特效
- tomcat使用自签名证书实现https加密访问
- 我插计算机英语,帮我翻译以下计算机英语的句子
- 低智商屌丝蒟蒻的2012成都题解
- 感知机(Perceptron)为什么不能表示异或(XOR)
- java web教程下载_Java Web云应用开发项目式教程 中文pdf扫描版[208MB]
- 单片机电子时钟设计(期末课程设计)
- Windows XP DOS命令大全
- UVALive - 6437题解
- 免费且快速搭建个人www服务器的教程
- 面试官:说说如何打破或违反双亲委派!
- Best practices for a new Go developer
- docker使用docker compose file部署项目时,实现容器卷挂载,并对容器内文件夹赋予权限
- Github优秀Android开源项目,值得引用与学习(图文结合~~~)
- 基于MATLAB编写的GNSS_SDR(GNSS软件接收机)——自学笔记(3)
- tf.strided_slice函数
- 网络打印服务器记录打印文件,使用 CNAME 记录合并打印服务器 - Windows Server | Microsoft Docs...
- icon图标网站分享,设计师必备收藏
- python添加趋势线
- 环境变量与命令行参数
热门文章
- [蓝桥杯][算法提高VIP]数的划分(记忆化搜索)
- Quadratic equation(二次剩余)2019牛客多校第九场
- php 段落加上标签,php – 如何在段落中添加ReadMore
- 【计算机组成原理】多功能算数逻辑运算单元
- openshift4离线部署_OpenShift 4.2 离线安装补充记录
- arcgis select by attributes一次选多个_地理工具学习--arcgis篇:单工具学习(2)
- 深度学习之生成对抗网络(6)GAN训练难题
- 用于安装python第三方库的工具是_Python第三方库安装
- 数学--数论--同余及其性质(超详细)
- 整合Struts2、Spring、Hibernate构建J2EE应用