首页
/
每日頭條
/
生活
/
前端項目反向代理原理
前端項目反向代理原理
更新时间:2025-10-31 02:08:51

前端項目反向代理原理?// pOjb就是通過new Proxy創建的代理對象 var pObj = new Proxy(obj, handlers) ,今天小編就來說說關于前端項目反向代理原理?下面更多詳細答案一起來看看吧!

前端項目反向代理原理(前端架構師成長之路)1

前端項目反向代理原理

// pOjb就是通過new Proxy創建的代理對象 var pObj = new Proxy(obj, handlers)

為什麼需要代理對象

舉個記賬的例子:

// obj代表我們,wallet屬性指我們錢包,現在我們錢包裡有100元 // consume指消費次數,每次消費加1, 記一筆賬 var obj = {wallet: 100} var consume = 0 // 這個月,我們喝了五次肥宅快樂水,每次消費我們都記一筆 // 今天消費3元 consume obj.wallet = 97 // 今天消費3元 consume obj.wallet = 94 // 今天消費3元 consume obj.wallet = 91 // 今天消費3元 consume obj.wallet = 88 // 今天消費3元 consume obj.wallet = 85

每次我們修改錢包剩餘金額時,都要執行一次consume 去執行一次記賬的操作。有沒有更簡單的方式,不需要每次都寫上一行代碼去增加消費次數呢?

答案當然有,它就是Proxy代理對象!使用代理對象,你想對目标對象的屬性操作全部改為對代理對象相同屬性的操作,代理對象提供了對屬性獲取 [[get]] 修改 [[set]] 等操作的攔截,js将這種攔截稱為trap(捕捉器)。

通過捕捉器,我們就可以捕獲到 代碼中對屬性的操作時機,讓我們能夠先執行我們自定義的業務邏輯代碼。因為我們對目标對象的屬性操作改為了對代理對象相同的屬性操作,所以我們在最後需要通過Reflact執行目标對象的原始操作。

var consume = 0 // 目标對象 var obj = {wallet: 100} // 捕獲器trap var handlers = { set(target, key, val) { // target 目标對象 // key 代理對象要修改的屬性 // 記錄一筆消費 consume // 通過Reflact對象觸發原始目标對象的屬性操作 // 相當于執行 target[key] = val Reflect.set(target, key, val) } } // 代理對象 var pObj = new Proxy(obj, handlers) // 将對目标對象obj的屬性wallet操作改為代理對象相同屬性wallet的操作 pObj.wallet = 97 pObj.wallet = 94 pObj.wallet = 91 pObj.wallet = 88 pObj.wallet = 85 console.log(obj.wallet) // 85 console.log(consume) // 5

如何取消代理

假如某一天,你實現了财務自由,不需要再精打細算記錄每一筆消費了,你可能就需要取消此前的代理,代碼很簡單,往下看:

var consume = 0 var obj = {wallet: 100} var handlers = { set(target, key, val) { consume Reflect.set(target, key, val) } } // 使用Proxy.revocable創建代理 var tmpObj = Proxy.revocable(obj, handlers) var pObj = tmpObj.proxy var prevoke = tmpObj.revoke // 使用代理對象進行消費記賬 pObj.wallet = 97 pObj.wallet = 94 pObj.wallet = 91 // 某一天,我們實現了一個小目标 pObj.wallet = 100000000 // 我們不需要記賬了,我們需要取消創建的代理 prevoke() // 執行prevoke即可,就是這麼簡單 哦耶~ pObj.wallet = 99999997 // TypeError 報錯啦 (代理取消之後就不能使用了喲!)

代理在後模式

前面的示例都是先執行代理捕獲器中的業務邏輯,最後再通過Reflect執行目标對象的屬性操作,這種捕獲代碼操作在前,目标對象操作在後的模式稱為“代理在先”模式,有在先,當然就有在後模式。

當然這裡的“代理在後”模式并不是先使用Reflect對象觸發目标對象屬性操作,在執行捕獲器中的其他操作代碼。而是指代理作為目标對象的一種補充,我們仍然操作的是目标對象,隻是當某些操作在目标對象上無法實現時,才使用代理對象。

等會,當某些操作目标對象無法提供時,js會向目标對象的原型prototype上進行查找,所以“代理在後”模式是對目标對象的原型進行代理!

var handlers = { get(target, key, context) { return function () { context.speak(key '!') } } } var catchall = new Proxy({}, handlers) var greeter = { speak(who = 'someone') { console.log('hello ', who) } } // 将catchall設置為greeter的原型 Object.setPrototypeOf(greeter, catchall) greeter.speak() // hello someone greeter.speak('world') // hello world // 執行greater上不存在的方法 greeter.everyone() // hello everyone!

Reflect

Reflect對象用來觸發目标對象執行相應的操作,就是這麼簡單!

Reflect.get(target, key, context) // 等價于 target[key] Reflect.set(target, key, val) // 等價于 target[key] = val

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
一千零一夜故事介紹
一千零一夜故事介紹
一千零一夜故事介紹?相傳古時候,在古阿拉伯的海島上,有一個薩桑王國,國王名叫山努亞有一天,山努亞和他的弟弟薩曼來到一片緊鄰大海的草原,當他們正在一棵樹下休息時,突然海中間冒起一個黑色的水柱,一個女郎來到了他們身邊,并告訴他們天下所有的婦女都...
2025-10-31
非常适合發朋友圈的句子很有格調
非常适合發朋友圈的句子很有格調
1.我們之所以會心累,就是常常徘徊在堅持和放棄之間,舉棋不定。我們之所以會煩惱,就是記性太好,該記的,不該記的都會留在記憶裡。我們之所以會痛苦,就是追求的太多。我們之所以不快樂,就是計較的太多,不是我們擁有的太少,而是我們計較的太多。2.人...
2025-10-31
偶像劇的經典狗血橋段
偶像劇的經典狗血橋段
心跳戀愛女主角是從漫畫穿越到現實裡的紙片人,傳說中四大家族之一白家的千金大小姐,名叫白蘇姬。(看餓了)她一出場就自帶光芒,像往常那樣穿着公主裙,去找家庭教師上課。但是對方告訴她并不是現實中的人,現在已經不流行瑪麗蘇了。原來女主所在的漫畫裡,...
2025-10-31
肝是否有問題一般做哪些檢查
肝是否有問題一般做哪些檢查
我看大部分的人在評論裡問,肝病都需要做哪些檢查?那今天就來帶大家了解一下第一,先查肝功能,就是轉氨酶、膽紅素、白蛋白、膽汁酸等;第二,B超,可以檢查出肝髒回聲粗糙、肝髒囊腫、肝髒結節、甚至血管瘤;第三,甲胎蛋白,可以檢查出結節的一個性質,防...
2025-10-31
中德英倫聯邦a區套三戶型
中德英倫聯邦a區套三戶型
中德英倫聯邦a區套三戶型?小區基本信息pk小區配套設施PK,我來為大家科普一下關于中德英倫聯邦a區套三戶型?下面希望有你要的答案,我們一起來看看吧!中德英倫聯邦a區套三戶型小區基本信息pk中德英倫聯邦A區藍光金悅派區縣商圈天府軟件園中和鎮小...
2025-10-31
Copyright 2023-2025 - www.tftnews.com All Rights Reserved