Object.defineProperty是ES5规定的。
语法
Object.defineProperty(obj,prop,descriptor)
参数
obj 要定义属性的对象。
prop 要定义或修改的属性的名称或 Symbol 。
descriptor 要定义或修改的属性描述符。
返回值
被传递给函数的对象。
源码中使用
defineReactive(obj, key, val) {
Object.defineProperty(obj, key, {
enumerable: true,
configurable: true,
get() {
return val
},
set(newVal) {
if ( val === newVal ) {
return
}
val = newVal
}
})
}
注意
1、为什么vue2.0对象增加或者删除属性,无法侦测到这个变化?
因为vue通过Object.defineProperty来将对象的key转换成getter/setter的形式来追踪变化,但getter/setter只能追踪一个数据是否被修改,无法追踪新增属性和删除属性。
为了解决这个问题,Vue提供了vm.delete。
参考: