您好,登錄后才能下訂單哦!
這篇文章主要介紹了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
:設置屬性語法:
set(target, key, value)
target
: 代理對象
key: 設置的屬性
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:刪除屬性
語法:
deleteProperty(target, key)
target
: 代理對象
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:判斷是否包含某屬性
語法:
has(target, key)
target
: 代理對象
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)
target
: 代理對象
栗子:
let origin={ x:1, y:2 } let proxy=new Proxy(origin,{ ownKeys:(target)=>{ return ['y'] } }) console.log(Object.getOwnPropertyNames(proxy)) // ['y']
getPrototypeOf
:獲取prototype
語法:
getPrototypeOf(target)
target
: 代理對象
栗子
let origin={ x:1, y:2 } let proxy=new Proxy(origin,{ getPrototypeOf:(target)=>{ return null } }) console.log(Object.getPrototypeOf(p)) // null
setPrototypeOf
:設置prototype
語法:
setPrototypeOf(target, prototype)
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
:設置屬性描述語法:
defineProperty(target, prop, descriptor)
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
:獲取自身屬性描述語法:
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中代理的示例分析內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。