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 相关文章推荐
php图像生成函数之间的区别分析
Dec 06 Javascript
js网页滚动条滚动事件实例分析
May 05 Javascript
jQuery左侧大图右侧小图焦点图幻灯切换代码分享
Aug 19 Javascript
JS实现三个层重叠点击互相切换的方法
Oct 06 Javascript
js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)
Mar 09 Javascript
jquery使用EasyUI Tree异步加载JSON数据(生成树)
Feb 11 Javascript
关于vue.js组件数据流的问题
Jul 26 Javascript
在Vue组件上动态添加和删除属性方法
Feb 23 Javascript
浅析JS中回调函数及用法
Jul 25 Javascript
vue + any-touch实现一个iscroll 实现拖拽和滑动动画效果
Apr 08 Javascript
es6 super关键字的理解与应用实例分析
Feb 15 Javascript
vue-cli4.x创建企业级项目的方法步骤
Jun 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生成便于打印的网页
2006/10/09 PHP
MySQL授权问题总结
2007/05/06 PHP
Zend Studio for Eclipse的java.lang.NullPointerException错误的解决方法
2008/12/06 PHP
php递归遍历多维数组的方法
2015/04/18 PHP
php将print_r处理后的数据还原为原始数组的解决方法
2016/11/02 PHP
使用javascript访问XML数据的实例
2006/12/27 Javascript
JSQL SQLProxy 的 php 版本代码
2010/05/05 Javascript
js 点击按钮弹出另一页,选择值后,返回到当前页
2010/05/26 Javascript
javascript中的对象创建 实例附注释
2011/02/08 Javascript
让你的博客飘雪花超出屏幕依然看得见
2013/01/04 Javascript
jQuery on()方法使用技巧详解
2015/04/16 Javascript
详解XMLHttpRequest(一)同步请求和异步请求
2016/09/14 Javascript
详解百度百科目录导航树小插件
2017/01/08 Javascript
js中数组插入、删除元素操作的方法
2017/02/15 Javascript
微信小程序之发送短信倒计时功能
2017/08/30 Javascript
springmvc接收jquery提交的数组数据代码分享
2017/10/28 jQuery
AngularJS2 与 D3.js集成实现自定义可视化的方法
2017/12/01 Javascript
AngularJS实现的根据数量与单价计算总价功能示例
2017/12/26 Javascript
vue3.0 CLI - 2.2 - 组件 home.vue 的初步改造
2018/09/14 Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
2018/12/21 Javascript
基于vue开发微信小程序mpvue-docs跳转页面功能
2019/04/10 Javascript
Vue运用transition实现过渡动画
2019/05/06 Javascript
layui异步加载table表中某一列数据的例子
2019/09/16 Javascript
[03:00]DOTA2-DPC中国联赛1月18日Recap集锦
2021/03/11 DOTA
Python标准库内置函数complex介绍
2014/11/25 Python
python实现查找两个字符串中相同字符并输出的方法
2015/07/11 Python
Python网络编程中urllib2模块的用法总结
2016/07/12 Python
在python Numpy中求向量和矩阵的范数实例
2019/08/26 Python
python和php哪个容易学
2020/06/19 Python
关于css中margin的值和垂直外边距重叠问题
2020/10/27 HTML / CSS
H5 canvas中width、height和style的宽高区别详解
2018/11/02 HTML / CSS
Revolution Beauty美国官网:英国知名化妆品网站
2018/07/23 全球购物
图书室标语
2014/06/21 职场文书
学生上课看漫画的检讨书
2014/09/26 职场文书
2016年教师党员公开承诺书
2016/03/24 职场文书
用Python提取PDF表格的方法
2021/04/11 Python