1. 程式人生 > 其它 >JS的Proxy——代理

JS的Proxy——代理

在支援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!

這樣就通過一個簡單的代理物件對資料進行了校驗。