第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

有沒(méi)有辦法使用 Javascript ES6 代理來(lái)監(jiān)視對(duì)象方法

有沒(méi)有辦法使用 Javascript ES6 代理來(lái)監(jiān)視對(duì)象方法

慕妹3146593 2022-07-21 10:29:04
有沒(méi)有可能,給定以下對(duì)象let target = { foo:0, result:[], bar(){   //some code }}然后將所述對(duì)象包裝在Proxy()let handler = {  get(){    // code here  },  apply(){    // code here   } } target = new Proxy(target,handler);捕獲調(diào)用bar()并將結(jié)果保存到results:[]?我已經(jīng)嘗試了幾次let target = {    called:0,    results:[],    foo(bar){        return bar;    },}let handler = {    get(target,prop){        console.log('Get Ran')        return target[prop];    },    apply(target,thisArg,args){        console.log('Apply Ran')        // never runs    }}target = new Proxy(target,handler);target.foo();此代碼錯(cuò)過(guò)了 [[ apply ]] 但捕獲了 [[ get ]] (如果內(nèi)存服務(wù),對(duì)象方法調(diào)用作為兩個(gè)操作完成,[[ get ]] [[ apply ]])let target = {    called:0,    results:[],    foo(bar){        return bar;    },}let handler = {    get(target,prop){        return target[prop];    },    apply(target,thisArg,args){        let product = target.apply(thisArg,args)        return product;    },}let prox = new Proxy(target.foo,handler);    console.log(prox('hello'));如果我改為將對(duì)象方法包裝在代理中,它會(huì)捕獲 [[ apply ]] 但我會(huì)丟失對(duì)原始對(duì)象( this )的引用,因此無(wú)法訪問(wèn)結(jié)果數(shù)組我還嘗試將方法代理嵌套在對(duì)象代理中。有什么想法嗎 ?
查看完整描述

1 回答

?
墨色風(fēng)雨

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)

}


查看完整回答
反對(duì) 回復(fù) 2022-07-21
  • 1 回答
  • 0 關(guān)注
  • 94 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)