Object.defineProperty
js
Object.defineProperty(obj, key, {
/* 这里的键名,都是属性描述符 */
configurable:false, //当为true时,该属性的描述符能够被改变,同时该属性也可以从对应的对象上删除。
enumerable:false,//该属性为true时,该属性才会出现在对象的枚举属性中。
value:'',//默认为false
writable:false,//当为true时,上面的value才能被赋值运算符改变。
get(){
console.log("取值");
},
set(x){
value=x;
console.log("设置");
}
})对于对象和数组属性,只监听其指针是否改变
- 当传入一个对象,和key,define会对这个对象的属性监听,只监听其在栈区是否改变,如果属性值包含对象或者包含数组,修改对象属性或者数组元素,不触发set
vue中Object.defineProperty
属性劫持时判断值是否为对象,是的话再对值进行劫持,不过Object.defineProperty有弊端
- 对于值为数组,数组内元素的增删改,不触发set视图更新
- 对于对象,对象属性的增删,不触发set视图更新
- 内部引用也会出发get、set
使用vm.$set,vm.$set(this.data, key/index, newValue)
JStar