vuejs源码关于observer部分的dep有什么作用

observer类:
constructor(value:any){
this.value=value
this.dep=newDep()
this.vmCount=0
def(value,'__ob__',this)
if(Array.isArray(value)){
constaugment=hasProto
?protoAugment
:copyAugment
augment(value,arrayMethods,arrayKeys)
this.observeArray(value)
}else{
this.walk(value)
}
}
这里的dep属性有什么作用呢?我知道defineReactive方法会改造gettersetter方法来收集依赖和通知watcher,但是这个方法里都是用的闭包里的dep来操作的,为什么还要在observer里面声明一个dep实例呢?
湖上湖
浏览 1132回答 2
2回答

偶然的你

这个dep属性是在Vue.$set和$delete中用到的。如$set中倒数第二行代码exportfunctionset(target:Array|Object,key:any,val:any):any{if(process.env.NODE_ENV!=='production'&&(isUndef(target)||isPrimitive(target))){warn(`Cannotsetreactivepropertyonundefined,null,orprimitivevalue:${(target:any)}`)}if(Array.isArray(target)&&isValidArrayIndex(key)){target.length=Math.max(target.length,key)target.splice(key,1,val)returnval}if(keyintarget&&!(keyinObject.prototype)){target[key]=valreturnval}constob=(target:any).__ob__if(target._isVue||(ob&&ob.vmCount)){process.env.NODE_ENV!=='production'&&warn('AvoidaddingreactivepropertiestoaVueinstanceoritsroot$data'+'atruntime-declareitupfrontinthedataoption.')returnval}if(!ob){target[key]=valreturnval}defineReactive(ob.value,key,val)ob.dep.notify()//这里的dep指的就是楼主所问的dep属性returnval}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript