exportfunctionset(target: Array<any>| Object, key: any, val: any): any {if(process.env.NODE_ENV!=='production'&&(isUndef(target)||isPrimitive(target))){warn(`Cannot set reactive property on undefined, null, or primitive value: ${(target: any)}`)}// 如果是数组 而且 是合法的下标if(Array.isArray(target)&&isValidArrayIndex(key)){
target.length = Math.max(target.length, key)// 数组场景,调用重写的splice方法,对新添加属性收集依赖
target.splice(key,1, val)return val
}// 到这说明是对象// 如果 key 存在于 target 里,target本身就是响应式,就直接赋新值即可if(key in target &&!(key inObject.prototype)){
target[key]= val
return val
}// 获取 target.__ob__const ob =(target: any).__ob__
//target不能是Vueif(target._isVue ||(ob && ob.vmCount)){
process.env.NODE_ENV!=='production'&&warn('Avoid adding reactive properties to a Vue instance or its root $data '+'at runtime - declare it upfront in the data option.')return val
}// 在 Observer 里介绍过,如果没有这个属性,就说明不是一个响应式对象if(!ob){
target[key]= val
return val
}// 然后把新添加的属性变成响应式defineReactive(ob.value, key, val)// 手动派发更新
ob.dep.notify()return val
}