JS的Proxy——代理
阿新 • • 發佈:2021-12-08
在支援Proxy的瀏覽器環境中,Proxy是一個全域性物件,它可以被直接使用。
Proxy(target,handler)是一個建構函式,target是被代理的物件,handlder是聲明瞭各類代理操作的物件,最終返回一個代理物件。
外界每次通過代理物件訪問target物件的屬性時,就會經過handler物件,從這個流程來看,代理物件很類似middleware(中介軟體)。
那麼,Proxy可以攔截什麼操作呢?最常見的就是get(讀取)、set(修改)物件屬性等操作。
簡單來說,Proxy的作用就是允許我們宣告一個代理,對某個物件進行一些特殊的訪問攔截。
一個Proxy物件由兩個部分組成:target、handler。
在通過Proxy建構函式生成例項物件時,需要提供這兩個引數。target即目標物件,handler是一個物件,聲明瞭代理target的指定行為。
比如,我們現在有如下一個物件。
let obj={
name:"liu",
age:18
}
當我們希望給obj賦值時,往往會直接這樣做。
obj.age="18"
這樣不是說不行,但是會出現問題,因為obj的age屬性分明希望得到一個number,但是我們卻賦值了一個string。
於是,我們就希望在給物件賦值的時候限制一下型別。思路大概是這樣的:給obj生成一個代理,obj就不會直接暴露給外面了。
如果你要操作obj,就和代理說,代理會幫obj做一個簡單的篩選。於是,程式碼就變成了如下這樣。
let obj={ name:"liu",
age:18 } let objProxy(obj,{ set(trage,key,value){ if(key=="age"&&typeof value1="number"){ throw new Error(`Invalid attempt to set ${key} to "${value} ":no number!`)
}
return target[key]=value;
},
get(target,key,receiver){
return target[key]
}
})
結果如下。
vue.runtime.esm.js:1888 Error:Invalid attempt to set age to "18":no number!
這樣就通過一個簡單的代理物件對資料進行了校驗。