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 相关文章推荐
javascript call方法使用说明
Jan 11 Javascript
Span元素的width属性无效果原因及解决方案
Jan 15 Javascript
基于jQuery的获取标签名的代码
Jul 16 Javascript
JavaScript高级程序设计 阅读笔记(十二) js内置对象Math
Aug 14 Javascript
将查询条件的input、select清空
Jan 14 Javascript
jquery中val()方法是从最后一个选项往前读取的
Sep 06 Javascript
表单验证正则表达式实例代码详解
Nov 09 Javascript
使用UrlConnection实现后台模拟http请求的简单实例
Jan 04 Javascript
JS模拟实现哈希表及应用详解
May 04 Javascript
Angular6 Filter实现页面搜索的示例代码
Dec 02 Javascript
vue项目在线上服务器访问失败原因分析
Aug 14 Javascript
使用compose函数优化代码提高可读性及扩展性
Jun 16 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
怎样在UNIX系统下安装php3
2006/10/09 PHP
IIS下PHP连接数据库提示mysql undefined function mysql_connect()
2010/06/04 PHP
解析mysql 表中的碎片产生原因以及清理
2013/06/22 PHP
destoon找回管理员密码的方法
2014/06/21 PHP
php提示Failed to write session data错误的解决方法
2014/12/17 PHP
PHP日期函数date格式化UNIX时间的方法
2015/03/19 PHP
Laravel框架集合用法实例浅析
2020/05/14 PHP
jquery 插件 任意位置浮动固定层
2008/12/25 Javascript
jQuery解决iframe高度自适应代码
2009/12/20 Javascript
用js来解决ajax读取页面乱码
2010/11/28 Javascript
jQuery侧边栏随窗口滚动实现方法
2013/03/04 Javascript
javascript的创建多行字符串的7种方法
2014/04/29 Javascript
jQuery实现的倒计时效果实例小结
2016/04/16 Javascript
学习vue.js表单控件绑定操作
2016/12/05 Javascript
微信小程序用户位置权限的获取方法(拒绝后提醒)
2018/11/15 Javascript
如何从头实现一个node.js的koa框架
2019/06/17 Javascript
详解微信小程序支付流程与梳理
2019/07/16 Javascript
微信小程序sessionid不一致问题解决
2019/08/30 Javascript
在Python下利用OpenCV来旋转图像的教程
2015/04/16 Python
Django URL传递参数的方法总结
2016/08/28 Python
python去掉空白行的多种实现代码
2018/03/19 Python
快速解决PyCharm无法引用matplotlib的问题
2018/05/24 Python
python实现XML解析的方法解析
2019/11/16 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
2020/02/13 Python
keras 获取某层的输入/输出 tensor 尺寸操作
2020/06/10 Python
如何利用python生成MD5并去重
2020/12/07 Python
html5-canvas中使用clip抠出一个区域的示例代码
2018/05/25 HTML / CSS
校园奶茶店创业计划书
2014/01/23 职场文书
护理专业大学生自我推荐信
2014/01/25 职场文书
安全生产管理责任书
2014/04/16 职场文书
爱护公共设施的标语
2014/06/24 职场文书
ktv周年庆活动方案
2014/08/18 职场文书
办公室务虚会发言材料
2014/10/20 职场文书
2015年网络管理员工作总结
2015/05/21 职场文书
Go标准容器之Ring的使用说明
2021/05/05 Golang
CSS几步实现赛博朋克2077风格视觉效果
2021/06/16 HTML / CSS