前言:vue是一个mvvm前端框架,数据(m)和视图(v)通过vm实现数据双向绑定,即数据的变化会反应到视图上,相反,视图的变化也会反应到视图上,其核心就是用到了Object.defineProperty()方法,其描述符的get和set对数据双向绑定起了关键性的作用,接下来详细进行介绍。
1. 语法
Object.defineProperty(obj, prop, descriptor)
其中:
obj —— 要在其上定义属性的对象
prop —— 要定义或修改的属性的名称
descriptor —— 将被定义或修改的属性描述符
返回值:传递给函数的对象obj
eg:这里给obj这个空对象定义了一个a属性,访问obj.a得到37
var obj = {}
Object.defineProperty(obj, 'a', {
value: 37
})
2. 参数descriptor属性描述符
descriptor包括数据描述符和存取描述符
1)数据描述符具有的如下可选键值:
value —— 该属性对应的值,默认值undefined
writable —— 布尔值,当设置为true时,该属性的value才能被赋值运算符改变,默认false
2)存储描述符具有的如下可选键值
get —— 一个给属性提供 getter 的方法,如果没有 getter 则为 undefined
。当访问该属性时,该方法会被执行
set —— 一个给属性提供 setter 的方法,如果没有 setter 则为 undefined
。当属性值修改时,触发执行该方法
3)数据描述符和存储描述符都具有的如下可选键值
configurable —— 当且仅当该属性的 configurable 为 true 时,该属性描述符
才能够被改变,同时该属性也能从对应的对象上被删除。默认为 false。
enumerable —— 当且仅当该属性的enumerable
为true
时,该属性才能够出现在对象的枚举属性中,(for...in
或 Object.keys
方法是否可枚举)。默认为 false。
4)注意事项
如果一个描述符同时有(value或writable)和(get或set)关键字,将会产生一个异常
eg:使用这些描述符
var obj = {}
Object.defineProperty(obj, 'key', {
configurable: true, //可被修改
enumerable : true, //可被枚举
writable : false, //value键值不能被改变 obj.key = 38将抛出错误
value: 37 //若同时具备get或set关键字,将会产生一个异常
})
3. 关于存储描述符的get和set
var obj = {};
Object.defineProperty(obj, 'a', {
configurable: true, //可被修改
enumerable : true, //可被遍历
writable : true, //value键值不能被改变 obj.key = 38将抛出错误
value: 37
}); // 特别地,若这几个键值都被设置为true,那么此时等价于var obj = {}; obj.a = 37;
//此时在对象中同时添加一个属性b,使用存储描述符
var bValue;
Object.defineProperty(obj, 'b', {
configurable: true, //可被修改
enumerable : true, //可被遍历
get: function () {
return bValue;
},
set: function (newValue) {
bValue = newValue;
},
})
赋值: obj.b = 38, 之后对象obj的属性b的值时38
4. 双向数据绑定案例,当在输入框中输入文本时,页面上会同步显示输入内容