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库还是自己写代码?
Jan 28 Javascript
JavaScript高级程序设计(第3版)学习笔记8 js函数(中)
Oct 11 Javascript
jquery Easyui快速开发总结
Aug 20 Javascript
浅析jQuery Ajax请求参数和返回数据的处理
Feb 24 Javascript
js面向对象实现canvas制作彩虹球喷枪效果
Sep 24 Javascript
JavaScript仿百度图片浏览效果
Nov 23 Javascript
简单实现js选项卡切换效果
Feb 09 Javascript
jQuery中hover方法搭配css的hover选择器,实现选中元素突出显示方法
May 08 jQuery
解决webpack -p压缩打包react报语法错误的方法
Jul 03 Javascript
利用node.js爬取指定排名网站的JS引用库详解
Jul 25 Javascript
解决Vue-cli npm run build生产环境打包,本地不能打开的问题
Sep 20 Javascript
解决layui富文本编辑器图片上传无法回显的问题
Sep 18 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中register_globals参数为OFF和ON的区别(register_globals 使用详解)
2012/02/05 PHP
PHP乱码问题,UTF-8乱码常见问题小结
2012/04/09 PHP
微信支付开发教程(一)微信支付URL配置
2014/05/28 PHP
thinkphp5框架API token身份验证功能示例
2019/05/21 PHP
PHP Swoole异步Redis客户端实现方法示例
2019/10/24 PHP
TopList标签和JavaScript结合两例
2007/08/12 Javascript
关于extjs treepanel复选框选中父节点与子节点的问题
2013/04/02 Javascript
基于javascript滚动图片具体实现
2013/11/18 Javascript
angularJS 中input示例分享
2015/02/09 Javascript
AspNet中使用JQuery boxy插件的确认框
2015/05/20 Javascript
JavaScript验证Email(3种方法)
2015/09/21 Javascript
JavaScript运行原理分析
2018/02/09 Javascript
JS实现checkbox互斥(单选)功能示例
2019/05/04 Javascript
vue使用原生swiper代码实例
2020/02/05 Javascript
JavaScript 如何计算文本的行数的实现
2020/09/14 Javascript
Swiper实现导航栏滚动效果
2020/10/16 Javascript
[01:23:59]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 VP vs Secret
2018/04/03 DOTA
python检测远程udp端口是否打开的方法
2015/03/14 Python
python模块简介之有序字典(OrderedDict)
2016/12/01 Python
python正则表达式及使用正则表达式的例子
2018/01/22 Python
Python实现的线性回归算法示例【附csv文件下载】
2018/12/29 Python
彻底理解Python中的yield关键字
2019/04/01 Python
python可视化爬虫界面之天气查询
2019/07/03 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
2019/11/30 Python
Python 实现自动获取种子磁力链接方式
2020/01/16 Python
安装完Python包然后找不到模块的解决步骤
2020/02/13 Python
Selenium向iframe富文本框输入内容过程图解
2020/04/10 Python
Python如何把字典写入到CSV文件的方法示例
2020/08/23 Python
为什么需要版本控制?
2013/08/08 面试题
检讨书1000字
2014/10/11 职场文书
西安导游词
2015/02/12 职场文书
导游带团欢迎词
2015/09/30 职场文书
培训心得体会怎么写
2016/01/25 职场文书
2016护理专业求职自荐书
2016/01/28 职场文书
百善孝为先:关于孝道的经典语录
2019/10/18 职场文书
MySQL悲观锁与乐观锁的实现方案
2021/11/02 MySQL