Object.defineProperty
vuejs的双向数据绑定就是通过他实现的(划重点!~)
vuejs中data下的属性都添加了set和get,所以数据改变触发set,而set会触发视图更新。computed计算缓存就是这个道理,当data没有改变,computed会将之前计算的结果返回,从而形成计算缓存。
先来个demo:
var a={};
Object.defineProperty(a,"test",{
value:2017
})
console.log(a.test);//2017
参数详解:
第一个参数:目标参数
第二个参数:需要定义的属性或者方法的名字
第三个参数:目标属性所拥有的特性(descriptor)
其中第三个参数还有以下参数!:
value:value值
writable:如果为false,属性为只读
configurable:总开关,如果为false,就不能在设置(value,writable,configurable 这里划重点!)
enumerable:是否在for in 中遍历出来
set:访问器set
get:访问器get
如果只设置value,相当于:
var a={};
Object.defineProperty(a,"test",{
value:2017,
writable:false,
enumerable:false,
configurable:false
})
console.log(a.test);//2017
但是只设置value,对set和get不起作用。
set和get
如果设置了set和get,就不能设置writable和value,否则会报错。
使用demo:
var a={};
Object.defineProperty(a,"testDemo",{
set:function(val){
console.log(val);
},
get:function(){
return "get内容"
}
})
a.testDemo="我是set";//我是set
console.log(a.testDemo);//get内容