vue3.0為什么要用Proxy對象

Object.defineProperty,定義響應(yīng)式的偽代碼:
function defineProperty(target,key,value){
  const dep = new Dep()
Object.defineProperty(target,key,{
get(){
 if (Dep.target){
//依賴收集
 dep.depend()
}
return value
},
set(newVal){
value=newVal
...
//通知更新
//dep.notify()
}

})
}

缺點(diǎn):

  1. 無法檢測到對象屬性的新增或刪除
    由于js的動態(tài)性,可以為對象追加新的屬性或者刪除其中某個(gè)屬性,這點(diǎn)對經(jīng)過Object.defineProperty方法建立的響應(yīng)式對象來說,只能追蹤對象已有數(shù)據(jù)是否被修改,無法追蹤新增屬性和刪除屬性,這就需要額外的代碼處理。
  2. 數(shù)組變化監(jiān)聽
    vue2.x是通過代理數(shù)組原型,包裝了一層數(shù)組的變異方法:'pop','shift','unshift','sort','reverse','splice', 'push'
  3. get set 攔截器不能直接操作target對象
Proxy對象
var proxy = new Proxy(obj, handler)

obj是要代理的對象,handler是定制攔截操作,返回一個(gè)代理對象
特點(diǎn):
Proxy代理是針對整個(gè)對象,不是針對對象屬性做攔截

劣勢:

  1. 性能比promise還差
  2. 兼容性不太樂觀 ,無法完全polyfill
    當(dāng)然,Proxy也不是沒有坑,尤其要注意代理對象方法的this指向問題;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容