1 回答

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊
根據(jù)規(guī)格
如果其 [[ProxyTarget]] 內(nèi)部槽的初始值是具有 [[Call]] 內(nèi)部方法的對(duì)象,則代理外來(lái)對(duì)象僅具有 [[Call]] 內(nèi)部方法。
所以如果目標(biāo)是一個(gè)function
(new Proxy(() => 'hello', { apply: () => console.log('catched') }))() // 'catched
反過(guò)來(lái),如果目標(biāo)沒(méi)有調(diào)用方法,則沒(méi)有代理
try {
(new Proxy({}, { apply: () => console.log('catched') }))() // throws
} catch (e){ console.log('e', e.message)}
所以提示可能是代理 [get] 而不是返回值(作為函數(shù)bar,代理該值以捕獲最終調(diào)用
const p = new Proxy(
{ results: [], bar: () => { console.log('rywhite') } }, {
get: (target, prop) => {
if (prop !== 'bar') return target[prop]
return new Proxy (target.bar, {
apply () {
target.results.push('what')
}
})
}
})
p.bar // nothing bud'
p.bar(); console.log('res', p.results)
p.bar(); console.log('res', p.results)
p.bar(); console.log('res', p.results)
編輯:注意:不必每次都創(chuàng)建新代理
在下面的代碼中,返回相同的代理大約快兩倍
const N = 1e6
{
const target = { results: 0, bar: () => { console.log('rywhite') } }
const p = new Proxy(
target, {
get: (() => {
const barProxy = new Proxy (target.bar, {
apply () {
target.results++
}
})
return (target, prop) => {
if (prop !== 'bar') return target[prop]
return barProxy
}
})()
})
console.time('go')
for (let i = 0; i < N; ++i) { p.bar() }
console.timeEnd('go')
console.log('res', p.results)
}
{
const p = new Proxy(
{ results: 0, bar: () => { console.log('rywhite') } }, {
get: (target, prop) => {
if (prop !== 'bar') return target[prop]
return new Proxy (target.bar, {
apply () {
target.results++
}
})
}
})
console.time('neweverytime')
for (let i = 0; i < N; ++i) { p.bar() }
console.timeEnd('neweverytime')
console.log('res', p.results)
}
添加回答
舉報(bào)