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

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

ES6 Proxy apply的疑問

ES6 Proxy apply的疑問

12345678_0001 2019-02-26 16:57:15
var twice = {    apply (target, ctx, args) {        return Reflect.apply(...arguments) * 2;    }};function sum (left, right) {    return left + right;};var proxy = new Proxy(sum, twice);console.log(proxy(1, 2))apply方法攔截函數(shù)的調(diào)用、call和apply操作。想了蠻久,始終沒懂執(zhí)行流程。
查看完整描述

1 回答

?
ibeautiful

TA貢獻(xiàn)1993條經(jīng)驗(yàn) 獲得超6個贊

攔截器中的Reflect.apply應(yīng)該相當(dāng)于調(diào)用sum.bind(ctx)。ctx是調(diào)用時的上下文對象,這里是undefined

這樣你調(diào)用proxy(1,2)的返回值就相當(dāng)于,Reflect.apply(...arguments)*2,也就是sum.bind(undefined)(1,2)。


阮大大有寫到:


Proxy 用于修改某些操作的默認(rèn)行為,等同于在語言層面做出修改,所以屬于一種“元編程”(meta programming),即對編程語言進(jìn)行編程。

Proxy 可以理解成,在目標(biāo)對象之前架設(shè)一層“攔截”,外界對該對象的訪問,都必須先通過這層攔截,因此提供了一種機(jī)制,可以對外界的訪問進(jìn)行過濾和改寫。

我個人理解是,本來你能直接達(dá)到目標(biāo)(直接調(diào)用sum),而現(xiàn)在你想訪問對象會經(jīng)過一個攔截層,你可以在調(diào)用前修改參數(shù),也可以在調(diào)用后修改返回值(比如本例的*2)。

攔截器類似元編程,相當(dāng)于修改語言特性的語法,比如本例就是對函數(shù)的apply機(jī)制進(jìn)行修改,其他代理如get、set等相當(dāng)于對對象的讀寫特性進(jìn)行了修改,表面上看就好像語言特性被修改了。

看下這兩個例子應(yīng)該就能明白如何用Proxy來代理一個函數(shù):


function sum(left, right) {

  return (this.x || left) + right;

}

var twice = {

  apply(target, ctx, args) {

    console.log(ctx == obj);

    return Reflect.apply(...arguments) * 2;

  },

};


var proxy = new Proxy(sum, twice);

let obj = { test: "test", proxy, x: 33 };

console.log(obj.proxy(1, 2));

//true

//70

//可見ctx為執(zhí)行環(huán)境this


var twice_changeParams = {

  apply(target, ctx, args) {

    args[1] = args[1] + 5;

    return Reflect.apply(...arguments) * 2;

  },

};

proxy = new Proxy(sum, twice_changeParams);

console.log(proxy(1, 2));

// 16

//16為sum(1,(2+5))*2 分別對輸入和輸出進(jìn)行了攔截

//這就是攔截器的含義


查看完整回答
反對 回復(fù) 2019-03-07
  • 1 回答
  • 0 關(guān)注
  • 339 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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