function defineReactive$$1 (obj,key,val,customSetter) {
var dep = new Dep(); // 管理属性依赖
var property = Object.getOwnPropertyDescriptor(obj, key);
if (property && property.configurable === false) {
return
}
// 之前已经设置了的get/set需要合并调用
var getter = property && property.get;
var setter = property && property.set;
var childOb = observe(val); // 属性值也可能是对象,需要递归观察处理
Object.defineProperty(obj, key, {
enumerable: true,
configurable: true,
get: function reactiveGetter () {
var value = getter ? getter.call(obj) : val;
if (Dep.target) { // 管理依赖对象存在指向的watcher实例
dep.depend(); // 添加依赖(记录)
if (childOb) { // 属性值为对象
childOb.dep.depend(); // 属性值对象也需要添加依赖
}
if (Array.isArray(value)) {
dependArray(value); // 处理数组
}
}
return value
},
set: function reactiveSetter (newVal) {
var value = getter ? getter.call(obj) : val;
/* eslint-disable no-self-compare */
if (newVal === value || (newVal !== newVal && value !== value)) {
return // 未发生变更不需要往后执行
}
/* eslint-enable no-self-compare */
if ("development" !== 'production' && customSetter) {
customSetter();
}
if (setter) {
setter.call(obj, newVal); // 更新属性值
} else {
val = newVal; // 更新属性值
}
childOb = observe(newVal); // 每次值变更时需要重新观察,因为可能值为对象
dep.notify(); // 发布更新事件
}
});
}