vue.js利用Object.defineProperty实现双向绑定


Posted in Javascript onMarch 09, 2017

Object.defineProperty这个方法了不起啊,vue.js是通过它实现双向绑定的。。而且Object.observe也被草案发起人撤回了。。所以defineProperty更有必要了解一下了。

几行代码看他怎么用

var a= {}
Object.defineProperty(a,"b",{
 value:123
})
console.log(a.b);//123

很简单,它接受三个参数,而且都是必填的。。

传入参数

第一个参数:目标对象
第二个参数:需要定义的属性或方法的名字。
第三个参数:目标属性所拥有的特性。(descriptor)

前两个参数不多说了,一看代码就懂,主要看第三个参数descriptor,看看有哪些取值

descriptor

他又以下取值,我们简单认识一下,后面例子,挨个介绍。

  • value:属性的值(不用多说了)
  • writable:如果为false,属性的值就不能被重写,只能为只读了
  • configurable:总开关,一旦为false,就不能再设置他的(value,writable,configurable)
  • enumerable:是否能在for...in循环中遍历出来或在Object.keys中列举出来。
  • get:一会细说
  • set:一会细说

descriptor 默认值

我们再看看第一个例子

var a= {}
Object.defineProperty(a,"b",{
 value:123
})
console.log(a.b);//123

我们只设置了 value,别的并没有设置,但是第一次的时候 可以简单的理解为(暂时这样理解)它会默认帮我们把writable,configurable,enumerable。都设上值,而且值还都是false。。也就是说,上面代码和下面是等价的的(仅限于第一次设置的时候)。

var a= {}
Object.defineProperty(a,"b",{
 value:123,
 writable:false,
 enumerable:false,
 configurable:false
})
console.log(a.b);//123

以上非常重要哦。。并且以上理解对set 和 get 不起作用哦

configurable

总开关,第一次设置 false 之后,,第二次什么设置也不行了,比如说

var a= {}
Object.defineProperty(a,"b",{
 configurable:false
})
Object.defineProperty(a,"b",{
 configurable:true
})
//error: Uncaught TypeError: Cannot redefine property: b

就会报错了。

注意上面讲的默认值。。。如果第一次不设置它会怎样。。会帮你设置为false。。所以。。第二次。再设置他会怎样?。。对喽,,会报错

writable

如果设置为fasle,就变成只读了。

var a = {}; 

Object.defineProperty(o, "b", { 
 value : 123,
 writable : false });

console.log(a.b); // 打印 37
a.b = 25; // 没有错误抛出(在严格模式下会抛出,即使之前已经有相同的值)
console.log(o.a); // 打印 37, 赋值不起作用。

enumerable

属性特性 enumerable 定义了对象的属性是否可以在 for...in 循环和 Object.keys() 中被枚举。

var a= {}
Object.defineProperty(a,"b",{
 value:3445,
 enumerable:true
})
console.log(Object.keys(a));// 打印["b"]

改为false

var a= {}
Object.defineProperty(a,"b",{
 value:3445,
 enumerable:false //注意咯这里改了
})
console.log(Object.keys(a));// 打印[]

for...in 类似,不赘述了

set 和 get

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

set 和 get,他俩干啥用的的。

var a= {}
Object.definePrope`请输入代码`rty(a,"b",{
 set:function(newValue){
 console.log("你要赋值给我,我的新值是"+newValue)
 },
 get:function(){
 console.log("你取我的值")
 return 2 //注意这里,我硬编码返回2
 }
})
a.b =1 //打印 你要赋值给我,我的新值是1
console.log(a.b) //打印 你取我的值
     //打印 2 注意这里,和我的硬编码相同的

简单来说,这个 “b” 赋值或者取值的时候会分别触发 set 和 get 对应的函数。

这就是实现observe的关键啊。

下一篇,我会分析vue的observe的实现源码,聊聊自己如何一步一步实现$watch。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
解决FLASH需要点击激活的代码
Dec 20 Javascript
Display SQL Server Version Information
Jun 21 Javascript
多个datatable共存造成多个表格的checkbox都被选中
Jul 11 Javascript
原生js与jQuery实现简单的tab切换特效对比
Jul 30 Javascript
js实现网页收藏功能
Dec 17 Javascript
AngularJS Phonecat实例讲解
Nov 21 Javascript
微信小程序中setInterval的使用方法
Sep 29 Javascript
JS/jQuery实现获取时间的方法及常用类完整示例
Mar 07 jQuery
VSCode使用之Vue工程配置eslint
Apr 30 Javascript
Express结合Webpack的全栈自动刷新
May 23 Javascript
Element-UI+Vue模式使用总结
Jan 02 Javascript
vue radio单选框,获取当前项(每一项)的value值操作
Sep 10 Javascript
javascript遍历json对象的key和任意js对象属性实例
Mar 09 #Javascript
微信小程序 五星评价功能的实现
Mar 09 #Javascript
javascript实现数据双向绑定的三种方式小结
Mar 09 #Javascript
jQuery插件HighCharts实现2D柱状图、折线图的组合多轴图效果示例【附demo源码下载】
Mar 09 #Javascript
Vue监听数据对象变化源码
Mar 09 #Javascript
html+javascript+bootstrap实现层级多选框全层全选和多选功能
Mar 09 #Javascript
Node.js常用工具之util模块
Mar 09 #Javascript
You might like
php模板中出现空行解决方法
2011/03/08 PHP
PHP无限分类(树形类)的深入分析
2013/06/02 PHP
php分页原理 分页代码 分页类制作教程
2016/09/23 PHP
PHP7新增函数
2021/03/09 PHP
统计出现最多的字符次数的js代码
2010/12/03 Javascript
jQuery AjaxQueue改进步骤
2011/10/06 Javascript
基于jQuery的360图片展示实现代码
2012/06/14 Javascript
滚动图片效果 jquery实现回旋滚动效果
2013/01/08 Javascript
JQuery+CSS提示框实现思路及代码(纯手工打造)
2013/05/07 Javascript
js中arguments的用法(实例讲解)
2013/11/30 Javascript
使用iframe window的scroll方法控制iframe页面滚动
2014/03/05 Javascript
打造个性化的功能强大的Jquery虚拟键盘(VirtualKeyboard)
2014/10/11 Javascript
jquery操作 iframe的方法
2014/12/03 Javascript
详解JavaScript中循环控制语句的用法
2015/06/03 Javascript
Javascript对象Clone实例分析
2015/06/09 Javascript
JS实现三个层重叠点击互相切换的方法
2015/10/06 Javascript
12个超实用的JQuery代码片段
2015/11/02 Javascript
jQuery实现的简单排序功能示例【冒泡排序】
2017/01/13 Javascript
JS中图片压缩的方法小结
2017/11/14 Javascript
vue2中的keep-alive使用总结及注意事项
2017/12/21 Javascript
如何通过javaScript去除字符串两端的空白字符
2020/02/06 Javascript
纯JS开发baguetteBox.js响应式画廊插件
2020/06/28 Javascript
Python采用socket模拟TCP通讯的实现方法
2014/11/19 Python
Python3网络爬虫开发实战之极验滑动验证码的识别
2019/08/02 Python
解决pyecharts运行后产生的html文件用浏览器打开空白
2020/03/11 Python
浅谈python量化 双均线策略(金叉死叉)
2020/06/03 Python
PyQt5 QDockWidget控件应用详解
2020/08/12 Python
Django数据模型中on_delete使用详解
2020/11/30 Python
浅谈Python xlwings 读取Excel文件的正确姿势
2021/02/26 Python
canvas 如何绘制线段的实现方法
2018/07/12 HTML / CSS
html5 http的轮询和Websocket原理
2018/10/19 HTML / CSS
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
饲料采购员岗位职责
2013/12/19 职场文书
参赛口号
2014/06/16 职场文书
2015年专项整治工作总结
2015/04/03 职场文书
Java对文件的读写操作方法
2022/04/29 Java/Android