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 对象模型 执行模型
Dec 06 Javascript
表格单元格交错着色实现思路及代码
Apr 01 Javascript
js中的布尔运算符使用介绍
Nov 20 Javascript
jQuery事件处理的特征(事件命名机制)
Aug 23 Javascript
一个极为简单的requirejs实现方法
Oct 20 Javascript
微信小程序中显示html格式内容的方法
Apr 25 Javascript
jQuery中$原理实例分析
Aug 13 jQuery
详解Vue.js使用Swiper.js在iOS
Sep 10 Javascript
关于vue的npm run dev和npm run build的区别介绍
Jan 14 Javascript
JS实现提示效果弹出及延迟隐藏的功能
Aug 26 Javascript
JS设置自定义快捷键并实现图片上下左右移动
Oct 17 Javascript
Nuxt.js nuxt-link与router-link的区别说明
Nov 06 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
《心理测量者3》剧场版动画预告
2020/03/02 日漫
php 解决旧系统 查出所有数据分页的类
2012/08/27 PHP
PHP文章按日期(月日)SQL归档语句
2012/11/29 PHP
php面向对象中static静态属性和静态方法的调用
2015/02/08 PHP
PHP中preg_match函数正则匹配的字符串长度问题
2015/05/27 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
2019/09/19 PHP
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(下:动画篇)
2010/03/24 Javascript
JQuery中html()方法使用不当带来的陷阱
2011/04/07 Javascript
推荐10个超棒的jQuery工具提示插件
2011/10/11 Javascript
用jQuery与JSONP轻松解决跨域访问的问题
2014/02/04 Javascript
如何在Linux上安装Node.js
2016/04/01 Javascript
jQuery 实现评论等级好评差评特效
2016/05/06 Javascript
Angular2数据绑定详解
2017/04/18 Javascript
bootstrap-table组合表头的实现方法
2017/09/07 Javascript
JavaScript实现图片拖曳效果
2017/09/08 Javascript
开发Vue树形组件的示例代码
2017/12/21 Javascript
pageGroup.js实现分页功能
2019/07/27 Javascript
Vue实现页面添加水印功能
2019/11/09 Javascript
自动化Nginx服务器的反向代理的配置方法
2015/06/28 Python
实用自动化运维Python脚本分享
2018/06/04 Python
pandas通过loc生成新的列方法
2018/11/28 Python
Python网页正文转换语音文件的操作方法
2018/12/09 Python
详解Python_shutil模块
2019/03/15 Python
python 为什么说eval要慎用
2019/03/26 Python
python爬虫之自制英汉字典
2019/06/24 Python
Python flask框架如何显示图像到web页面
2020/06/03 Python
python 5个顶级异步框架推荐
2020/09/09 Python
Python 实现集合Set的示例
2020/12/21 Python
Python 调用C++封装的进一步探索交流
2021/03/04 Python
《阳光》教学反思
2014/02/23 职场文书
岗位明星事迹材料
2014/05/18 职场文书
学校周年庆活动方案
2014/08/22 职场文书
评职称个人总结
2015/03/05 职场文书
从严治党主题教育活动总结
2015/05/07 职场文书
《家庭教育》读后感3篇
2019/12/18 职场文书
Nginx反向代理及负载均衡如何实现(基于linux)
2021/03/31 Servers