這篇文章帶給大家的內容是關於es6中代理的詳細介紹(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
代理嘛,就是請代理人代替自己做某件事,但是和自己不一樣的是代理人可以有自己的行為,甚至可以做出和預期相違背的行為。
宣告一個普通物件origin,他有一個屬性name
let origin={ name: 'origin' }
宣告一個代理物件
let proxy=new Proxy(origin, { get: (target, key)=>target[key]+" from proxy", set: (target, key, value)=>target[key]="set by proxy "+value })
此時輸出origin
和proxy
,可以發現,proxy
擁有和origin
一樣的name
屬性
console.log(origin) // {name: 'origin'} console.log(proxy) // Proxy {name: 'origin'}
為origin
新增age
屬性,再輸出,可以發現,origin
和proxy
都擁有了age
屬性
origin.age=1 console.log(origin) // {name: 'origin', age: '1'} console.log(proxy) // Proxy {name: 'origin', age '1'}
那就是代理嗎,當然不是,我們嘗試為proxy
添加屬性
proxy.x=1 console.log(origin) // {name: 'origin', age: '1', x:'set by proxy 1'} console.log(proxy) // Proxy {name: 'origin', age '1'}
可以發現,雖然origin
和proxy
都擁有了x
屬性,但是不是我們賦值的1
,而是多了set by proxy
幾個字串,很明顯,這裡是執行了初始化proxy
時傳入的第二個物件的set
方法
那如果我們get
呢
console.log(proxy.x) // set by proxy 1 console.log(proxy.x) // set by proxy 1 from proxy
現在很清楚了,proxy
就是origin
的代理,所有在proxy
#上的操作都會同步到origin
上,而對origin
的操作卻不會同步到proxy
上,而且proxy
還有自己的行為。
可以這麼想,proxy
就是origin
的秘書,所有的事務處理都要提交給秘書,秘書有自己的辦事準則,可以直接提交給老闆,也可以拒絕提交,或添加一些其他的行為再提交。那這個秘書到底能代理老闆做哪些事呢?
語法
let p = new Proxy(target, handler);
初始化一個代理程式需要有兩個參數
##target:代理目標
handle:陷阱,是一個對象,我們的操作就像一隻逃跑的動物,如果獵人在所有可以逃跑的路上全部放滿了陷阱,那我們總是會落入一起一個的。本質就是一個對象,鍵描述我們的操作,值是函數,描述我們的行為,一共有
13種陷阱。
:設定屬性
set(target, key, value)
target: 代理物件
value: 設定的屬性值
let origin={} let proxy=new Proxy(origin,{ set:(target, key, value)=>{ if(value>5)target[key]=value+10000 } }) proxy.x=1 proxy.y=10 console.log(proxy) // Proxy {y: 10010} console.log(origin) // {y: 10010}
上面我們放置了一個
set 陷阱,當我們做
set操作的時候,就會被捕捉到,我們判斷
value是否大於
5,如果不大於
5我們就不會做任何東西,但是如果大於
5,就會給做賦值操作,並且還將他加上了
10000。上面的栗子就等於一個攔截器了。
get:存取屬性
語法:get(target, key)
target: 代理物件
##key: 訪問的屬性
栗子:
let origin={ x:1, y:2 } let proxy=new Proxy(origin,{ get:(target, key)=>{ if(key==='x')return 'no' return target[key] } }) console.log(proxy.x) // 'no' console.log(proxy.y) // 2
語法:
deleteProperty(target, key)
:代理物件key: 要刪除的屬性
栗子:
let origin={ x:1, y:2 } let proxy=new Proxy(origin,{ deleteProperty:(target, key)=>{ if(key==='x')return delete target[key] } }) delete proxy.x delete proxy.y console.log(proxy) // {x:1}
語法:
has(target, key)
: 代理物件key: 要判斷的屬性
栗子:
let origin={ x:1, y:2 } let proxy=new Proxy(origin,{ has:(target, key)=>{ if(key==='x')return false return true } }) console.log('x' in proxy) // false console.log('y' in proxy) // true
ownKeys
ownKeys(target)
: 代理物件
let origin={ x:1, y:2 } let proxy=new Proxy(origin,{ ownKeys:(target)=>{ return ['y'] } }) console.log(Object.getOwnPropertyNames(proxy)) // ['y']
prototype
getPrototypeOf(target)
#: 代理物件
let origin={ x:1, y:2 } let proxy=new Proxy(origin,{ getPrototypeOf:(target)=>{ return null } }) console.log(Object.getPrototypeOf(p)) // null
prototype
setPrototypeOf(target, prototype)
: 代理物件
: 要設定的prototype
let origin={ x:1, y:2 } let proxy=new Proxy(origin,{ setPrototypeOf:(target, prototype)=>{ throw 'no' } }) Object.setPrototypeOf(proxy, {}) // Uncaught no
defineProperty(target, prop, descriptor)
: 代理物件
: 要設定描述的屬性
: 描述
let origin={} let proxy=new Proxy(origin,{ defineProperty:(target, prop, descriptor)=>{ throw 'no' } }) Object.defineProperty(proxy, 'x', {configurable: true}) // Uncaught no
getOwnPropertyDescriptor(target, prop)
target
: 代理对象
prop
: 获取描述的属性
栗子
let origin={} let proxy=new Proxy(origin,{ getOwnPropertyDescriptor:(target, prop)=>{ throw 'no' } }) Object.getOwnPropertyDescriptor(proxy, 'x') // Uncaught no
isExtensible
:判断是否可扩展语法:
isExtensible(target)
target
: 代理对象
栗子
let origin={} let proxy=new Proxy(origin,{ isExtensible:(target)=>{ return false } }) console.log(Object.isExtensible(proxy)); // false
preventExtensions
:阻止扩展语法:
preventExtensions(target)
target
: 代理对象
栗子:
let origin={} let proxy=new Proxy(origin,{ preventExtensions:(target)=>{ return false; } }) console.log(Object.preventExtensions(proxy)); // Uncaught TypeError: 'preventExtensions' on proxy: trap returned falsish
construct
:构造语法:
construct(target, argumentsList, newTarget)
target
: 代理对象
argumentsList
: 参数列表
newTarget
: 新对象
栗子:
let Origin=function(){} let OriginProxy=new Proxy(Origin,{ construct: function(target, argumentsList, newTarget) { throw 'error' } }) new OriginProxy() // Uncaught error
apply
:调用语法:
apply(target, thisArg, argumentsList)
target: 代理对象
thisArg: 上下文
argumentsList: 参数列表
栗子:
let origin=function(){} let proxy=new Proxy(origin,{ apply: function(target, thisArg, argumentsList) { throw 'error' } }) origin() // Uncaught error
以上是es6中代理程式的詳細介紹(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!