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 StringBuilder类实现
Dec 22 Javascript
js下获取div中的数据的原理分析
Apr 07 Javascript
js中获取事件对象的方法小结
Mar 13 Javascript
Jquery中Ajax 缓存带来的影响的解决方法
May 19 Javascript
onkeypress字符按键兼容所有浏览器使用介绍
Apr 24 Javascript
jquery append 动态添加的元素事件on 不起作用的解决方案
Jul 30 Javascript
node.js实现复制文本到剪切板的功能
Jan 23 Javascript
js,jq,css多方面实现简易下拉菜单功能
May 13 Javascript
Vuejs实现购物车功能
Nov 05 Javascript
Vue+Mock.js模拟登录和表格的增删改查功能
Jul 26 Javascript
Vue中util的工具函数实例详解
Jul 08 Javascript
解决Echarts 显示隐藏后宽度高度变小的问题
Jul 19 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实现WEB动态网页静态
2006/10/09 PHP
社区(php&&mysql)二
2006/10/09 PHP
php 远程关机操作的代码
2008/12/05 PHP
PHP中JSON的应用技巧
2015/10/10 PHP
php metaphone()函数的定义和用法
2016/05/15 PHP
php获取访问者浏览页面的浏览器类型
2017/01/23 PHP
ie下动态加态js文件的方法
2011/09/13 Javascript
JS的replace方法介绍
2012/10/20 Javascript
JavaScript实现算术平方根算法-代码超简单
2015/09/11 Javascript
使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目
2016/02/15 Javascript
XML、HTML、CSS与JS的区别整理
2016/02/18 Javascript
js 判断一组日期是否是连续的简单实例
2016/07/11 Javascript
Jquery表单验证失败后不提交的解决方法
2016/10/18 Javascript
Javascript this 函数深入详解
2016/12/13 Javascript
Vue学习笔记进阶篇之多元素及多组件过渡
2017/07/19 Javascript
详解Chart.js轻量级图表库的使用经验
2018/05/22 Javascript
Vue隐藏显示、只读实例代码
2018/07/18 Javascript
React 组件中的 bind(this)示例代码
2018/09/16 Javascript
JS中call()和apply()的功能及用法实例分析
2019/06/28 Javascript
微信小程序实现注册登录功能(表单校验、错误提示)
2019/12/10 Javascript
vue-router 按需加载 component: () => import() 报错的解决
2020/09/22 Javascript
JSON stringify方法原理及实例解析
2020/10/23 Javascript
python使用rsa加密算法模块模拟新浪微博登录
2014/01/22 Python
如何高效使用Python字典的方法详解
2017/08/31 Python
Python实现DDos攻击实例详解
2019/02/02 Python
Django框架自定义模型管理器与元选项用法分析
2019/07/22 Python
python3.7 的新特性详解
2019/07/25 Python
Django框架创建mysql连接与使用示例
2019/07/29 Python
Django之PopUp的具体实现方法
2019/08/31 Python
jupyter notebook oepncv 显示一张图像的实现
2020/04/24 Python
解决Django Haystack全文检索为空的问题
2020/05/19 Python
pycharm Tab键设置成4个空格的操作
2021/02/26 Python
HTML5的结构和语义(5):交互
2008/10/17 HTML / CSS
关于成立领导小组的通知
2015/04/23 职场文书
2016年区委书记抓基层党建工作公开承诺书
2016/03/25 职场文书
mysql数据库隔离级别详解
2022/06/16 MySQL