整体流程
vm.$set(target,key,val)
function set(target,key,val){ //有效的下标 if(Array.isArray(target) && isValidArrayIndex(key)){ target.length = Math.max(target.length,key) target.splice(key,1,val) return val } if(key in target && !(key in Object.prototype)){ target[key] = val return val } const ob = target.__ob__ if(target.isVue || (ob && ob.vmCount)){ return val } if(!ob){ target[key] = val return val } defineReactive(ob.value,key,val) ob.dep.notify() return val }
vm.$delete(target,key)
function del(target,key){ if(Array.isArray(target) && isValidArrayIndex(key)){ target.splice(key,1) return } const ob = target.__ob__ if(target.isVue || (ob && ob.vmCount)){ return } // 如果key不是target自身的属性,则终止程序继续执行 if(!hasOwn(target,key)){ return } delete target[key] // 如果ob不存在(判断target是不是一个响应式数据),则直接终止程序 if(!ob){ return } ob.dep.notify() }
未完待续...