|
導(dǎo)讀網(wǎng)頁(yè)的本質(zhì)就是超級(jí)文本標(biāo)記語(yǔ)言,通過(guò)結(jié)合使用其他的Web技術(shù)(如:腳本語(yǔ)言、公共網(wǎng)關(guān)接口、組件等),可以創(chuàng)造出功能強(qiáng)大的網(wǎng)頁(yè)。因而,超級(jí)文本標(biāo)記語(yǔ)言是萬(wàn)維網(wǎng)(Web)編程的基礎(chǔ),也就是說(shuō)萬(wàn)維網(wǎng)是建立... 網(wǎng)頁(yè)的本質(zhì)就是超級(jí)文本標(biāo)記語(yǔ)言,通過(guò)結(jié)合使用其他的Web技術(shù)(如:腳本語(yǔ)言、公共網(wǎng)關(guān)接口、組件等),可以創(chuàng)造出功能強(qiáng)大的網(wǎng)頁(yè)。因而,超級(jí)文本標(biāo)記語(yǔ)言是萬(wàn)維網(wǎng)(Web)編程的基礎(chǔ),也就是說(shuō)萬(wàn)維網(wǎng)是建立在超文本基礎(chǔ)之上的。超級(jí)文本標(biāo)記語(yǔ)言之所以稱為超文本標(biāo)記語(yǔ)言,是因?yàn)槲谋局邪怂^“超級(jí)鏈接”點(diǎn)。 本篇文章給大家?guī)?lái)的內(nèi)容是關(guān)于es6中代理的詳細(xì)介紹(代碼示例),有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。概述代理嘛,就是請(qǐng)代理人代替自己做某件事,但是和自己不一樣的是代理人可以有自己的行為,甚至可以做出和預(yù)期相違背的行為。 栗子聲明一個(gè)普通對(duì)象origin,他有一個(gè)屬性name let origin={
name: 'origin'
}聲明一個(gè)代理對(duì)象 let proxy=new Proxy(origin, {
get: (target, key)=>target[key]+" from proxy",
set: (target, key, value)=>target[key]="set by proxy "+value
})此時(shí)輸出origin和proxy,可以發(fā)現(xiàn),proxy擁有和origin一樣的name屬性 console.log(origin) // {name: 'origin'}
console.log(proxy) // Proxy {name: 'origin'}為origin添加age屬性,再輸出,可以發(fā)現(xiàn),origin和proxy都擁有了age屬性 origin.age=1
console.log(origin) // {name: 'origin', age: '1'}
console.log(proxy) // Proxy {name: 'origin', age '1'}那就是代理嗎,當(dāng)然不是,我們嘗試為proxy添加屬性 proxy.x=1
console.log(origin) // {name: 'origin', age: '1', x:'set by proxy 1'}
console.log(proxy) // Proxy {name: 'origin', age '1'}可以發(fā)現(xiàn),雖然origin和proxy都擁有了x屬性,但是并不是我們賦值的1,而是多了set by proxy 幾個(gè)字符串,很明顯,這里是執(zhí)行了初始化proxy時(shí)傳入的第二個(gè)對(duì)象的set方法 那如果我們get呢 console.log(proxy.x) // set by proxy 1
console.log(proxy.x) // set by proxy 1 from proxy 現(xiàn)在很清楚了,proxy就是origin的代理,所有在proxy上的操作都會(huì)同步到origin上,而對(duì)origin的操作卻不會(huì)同步到proxy上,而且proxy還有自己的行為。 可以這么想,proxy就是origin的秘書(shū),所有的事務(wù)處理都要提交給秘書(shū),秘書(shū)有自己的辦事準(zhǔn)則,可以直接提交給老板,也可以拒絕提交,或者添加一些其他的行為再提交。那這個(gè)秘書(shū)到底能代理老板做哪些事呢? 陷阱語(yǔ)法 let p = new Proxy(target, handler); 初始化一個(gè)代理需要有兩個(gè)參數(shù) target:代理目標(biāo)
handle:陷阱,是一個(gè)對(duì)象,我們的操作就像一只逃跑的動(dòng)物,如果獵人在所有可以逃跑的路上全部放滿了陷阱,那我們總是會(huì)落入一起一個(gè)的。本質(zhì)就是一個(gè)對(duì)象,鍵描述我們的操作,值是函數(shù),描述我們的行為,一共有13種陷阱。
0x003 set:設(shè)置屬性語(yǔ)法: set(target, key, value) target: 代理對(duì)象
key: 設(shè)置的屬性 value: 設(shè)置的屬性值
栗子: 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}說(shuō)明: 上面我們放置了一個(gè)set陷阱,當(dāng)我們做set操作的時(shí)候,就會(huì)被捕捉到,我們判斷value是否大于5,如果不大于5我們就不會(huì)做任何東西,但是如果大于5,就會(huì)給做賦值操作,并且還將他加上了10000。上面的栗子就相當(dāng)于一個(gè)攔截器了。 get:訪問(wèn)屬性 語(yǔ)法: get(target, key) target: 代理對(duì)象
key: 訪問(wèn)的屬性 栗子: 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:刪除屬性 語(yǔ)法: deleteProperty(target, key) target: 代理對(duì)象
key: 要?jiǎng)h除的屬性 栗子: 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:判斷是否包含某屬性 語(yǔ)法: has(target, key) target: 代理對(duì)象
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:獲取自身屬性值getPrototypeOf:獲取prototype
setPrototypeOf:設(shè)置prototype
語(yǔ)法: setPrototypeOf(target, prototype) 栗子 let origin={
x:1,
y:2
}
let proxy=new Proxy(origin,{
setPrototypeOf:(target, prototype)=>{
throw 'no'
}
})
Object.setPrototypeOf(proxy, {}) // Uncaught no
defineProperty :設(shè)置屬性描述
語(yǔ)法: defineProperty(target, prop, descriptor) target: 代理對(duì)象
prop: 要設(shè)置描述的屬性
descriptor: 描述
栗子 let origin={}
let proxy=new Proxy(origin,{
defineProperty:(target, prop, descriptor)=>{
throw 'no'
}
})
Object.defineProperty(proxy, 'x', {configurable: true}) // Uncaught no
getOwnPropertyDescriptor :獲取自身屬性描述
語(yǔ)法: getOwnPropertyDescriptor(target, prop) target: 代理對(duì)象
prop: 獲取描述的屬性
栗子 let origin={}
let proxy=new Proxy(origin,{
getOwnPropertyDescriptor:(target, prop)=>{
throw 'no'
}
})
Object.getOwnPropertyDescriptor(proxy, 'x') // Uncaught no
isExtensible:判斷是否可擴(kuò)展
preventExtensions :阻止擴(kuò)展
語(yǔ)法: preventExtensions(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:構(gòu)造
語(yǔ)法: construct(target, argumentsList, newTarget) target: 代理對(duì)象
argumentsList: 參數(shù)列表
newTarget: 新對(duì)象
栗子: let Origin=function(){}
let OriginProxy=new Proxy(Origin,{
construct: function(target, argumentsList, newTarget) {
throw 'error'
}
})
new OriginProxy() // Uncaught error
apply:調(diào)用
語(yǔ)法: apply(target, thisArg, argumentsList) target: 代理對(duì)象 thisArg: 上下文 argumentsList: 參數(shù)列表 栗子: let origin=function(){}
let proxy=new Proxy(origin,{
apply: function(target, thisArg, argumentsList) {
throw 'error'
}
})
origin() // Uncaught error
以上就是es6中代理的詳細(xì)介紹(代碼示例)的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!
網(wǎng)站建設(shè)是一個(gè)廣義的術(shù)語(yǔ),涵蓋了許多不同的技能和學(xué)科中所使用的生產(chǎn)和維護(hù)的網(wǎng)站。
|