【ES6新特性】Proxy進階實戰

🌟ES6 Proxy終極指南:從攔截器到響應式框架實現🔥

在這里插入圖片描述


一、💡 為什么Proxy是革命性的?先看痛點場景

1.1 Object.defineProperty的局限 😫

// Vue2響應式實現
let data = { count: 0 };
Object.defineProperty(data, 'count', {get() { /* 依賴收集 */ },set() { /* 觸發更新 */ }
});// 痛點:
// 1. 無法檢測數組變化
// 2. 需要遞歸遍歷對象
// 3. 無法攔截屬性的新增/刪除
data.arr.push(1); // 不會觸發更新

1.2 Proxy的三大降維打擊優勢 🔥

  1. 全攔截能力:13種對象操作攔截
  2. 非侵入式監控:無需修改原對象
  3. 性能優化空間:懶代理+緩存策略

二、🚀 Proxy核心API完全解析

2.1 基礎語法與攔截器全集 📚

const handler = {// 🔥 核心攔截操作(部分)get(target, prop) { /* 屬性讀取 */ },set(target, prop, value) { /* 屬性設置 */ },apply(target, thisArg, args) { /* 函數調用 */ },construct(target, args) { /* new操作 */ },has(target, prop) { /* in操作符 */ },deleteProperty(target, prop) { /* delete操作 */ }
};const proxy = new Proxy(target, handler);

2.2 與Reflect的黃金組合 💎

Proxy陷阱Reflect方法說明
getReflect.get保持默認行為
setReflect.set返回操作結果布爾值
applyReflect.apply保持函數執行上下文
constructReflect.construct正確維護new.target

正確用法示例

const handler = {get(target, prop, receiver) {console.log(`Getting ${prop}`);return Reflect.get(...arguments);}
};

三、💎 五大框架級實戰場景

3.1 場景1:實現Vue3響應式系統 🚀

const reactiveMap = new WeakMap();function reactive(obj) {const proxy = new Proxy(obj, {get(target, key, receiver) {track(target, key); // 依賴收集return Reflect.get(...arguments);},set(target, key, value, receiver) {const result = Reflect.set(...arguments);trigger(target, key); // 觸發更新return result;}});reactiveMap.set(obj, proxy);return proxy;
}// 使用
const state = reactive({ count: 0 });
state.count++; // 自動觸發更新

3.2 場景2:實現ORM層查詢攔截 ?

const database = {users: [{ id: 1, name: 'Alice', age: 25 }]
};const dbProxy = new Proxy(database, {get(target, prop) {if (prop === 'findUser') {return (id) => target.users.find(u => u.id === id);}return Reflect.get(...arguments);}
});console.log(dbProxy.findUser(1)); // 自動創建查詢方法

3.3 場景3:實現API請求攔截器 🌐

const apiHandler = {get(target, prop) {return (...args) => {const [params] = args;console.log(`Calling ${prop} with`, params);return fetch(`/api/${prop}`, { body: JSON.stringify(params) });};}
};const api = new Proxy({}, apiHandler);// 使用
api.getUser({ id: 1 }); // 自動生成接口調用

四、? 高級模式與性能優化

4.1 遞歸代理實現 🧠

function deepProxy(obj, handler) {if (typeof obj === 'object' && obj !== null) {for (let key in obj) {obj[key] = deepProxy(obj[key], handler);}return new Proxy(obj, handler);}return obj;
}const state = deepProxy({ user: { name: 'Bob',address: { city: 'Beijing' }}
}, {set(target, prop, value) {console.log('Deep set:', prop);return Reflect.set(...arguments);}
});state.user.address.city = 'Shanghai'; // 觸發日志

4.2 性能壓測與優化策略 📊

// 創建10萬屬性的對象
const data = Array(1e5).fill(0).reduce((acc, _, i) => {acc[i] = i;return acc;
}, {});// 普通訪問
console.time('Raw access');
data[50000]; 
console.timeEnd('Raw access'); // ~0.01ms// Proxy訪問
const proxy = new Proxy(data, {});
console.time('Proxy access');
proxy[50000];
console.timeEnd('Proxy access'); // ~0.03ms// 優化方案:緩存常用屬性訪問
const cacheHandler = {get(target, prop) {if (prop === 'cachedProp') {return target[prop] ||= computeExpensiveValue();}return Reflect.get(...arguments);}
};

五、📌 高頻面試題精選

Q1:Proxy與Object.defineProperty的區別?

💡 深度解析

特性ProxyObject.defineProperty
攔截范圍13種操作僅get/set
數組處理完美支持需要hack處理
屬性監聽全屬性自動監聽需顯式定義每個屬性
性能影響輕微大量屬性時較差

Q2:如何實現撤銷代理?

const { proxy, revoke } = Proxy.revocable({}, {get(target, prop) {return `Accessing ${prop}`;}
});console.log(proxy.name); // Accessing name
revoke();
console.log(proxy.name); // TypeError: Cannot perform 'get' on a proxy that has been revoked

六、🌈 總結與最佳實踐

🚦 Proxy使用決策矩陣

場景推薦方案
數據響應式Proxy + 依賴跟蹤
API網關方法攔截自動生成
權限控制操作前校驗攔截
日志/性能監控透明化行為記錄

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/76874.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76874.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/76874.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c++解決動態規劃

一、引言: 在我們學習了算法之后,我們一定遇到過貪心算法。而在貪心算法中就有著這樣一個經典的例子——湊錢。 Eg: 你有面額為10、5、1的紙幣,當你買菜時需要花費26元,請問需要最少的紙幣張數是多少。 當我們用貪心算法去解決這個問題的時候,我們…

Qwen 2.5 VL 多種推理方案

Qwen 2.5 VL 多種推理方案 flyfish 單圖推理 from modelscope import Qwen2_5_VLForConditionalGeneration, AutoTokenizer, AutoProcessor from qwen_vl_utils import process_vision_info import torchmodel_path "/media/model/Qwen/Qwen25-VL-7B-Instruct/"m…

機器視覺檢測Pin針歪斜應用

在現代電子制造業中,Pin針(插針)是連接器、芯片插座、PCB板等元器件的關鍵部件。如果Pin針歪斜,可能導致接觸不良、短路,甚至整機失效。傳統的人工檢測不僅效率低,還容易疲勞漏檢。 MasterAlign 機器視覺對…

經典算法問題解析:兩數之和與三數之和的Java實現

文章目錄 1. 問題背景2. 兩數之和(Two Sum)2.1 問題描述2.2 哈希表解法代碼實現關鍵點解析復雜度對比 3. 三數之和(3Sum)3.1 問題描述3.2 排序雙指針解法代碼實現關鍵點解析復雜度分析 4. 對比總結5. 常見問題解答6. 擴展練習 1. …

1022 Digital Library

1022 Digital Library 分數 30 全屏瀏覽 切換布局 作者 CHEN, Yue 單位 浙江大學 A Digital Library contains millions of books, stored according to their titles, authors, key words of their abstracts, publishers, and published years. Each book is assigned an u…

地理人工智能中位置編碼的綜述:方法與應用

以下是對論文 《A Review of Location Encoding for GeoAI: Methods and Applications》 的大綱和摘要整理: A Review of Location Encoding for GeoAI: Methods and Applications 摘要(Summary) 本文系統綜述了地理人工智能(G…

(C語言)算法復習總結2——分治算法

1. 分治算法的定義 分治算法(Divide and Conquer)是一種重要的算法設計策略。 “分治” 從字面意義上理解,就是 “分而治之”。 它將一個復雜的問題分解成若干個規模較小、相互獨立且與原問題形式相同的子問題,然后遞歸地解決這…

愛普生FC1610AN5G手機中替代傳統晶振的理想之選

在 5G 技術引領的通信新時代,手機性能面臨前所未有的挑戰與機遇。從高速數據傳輸到多任務高效處理,從長時間續航到緊湊輕薄設計,每一項提升都離不開內部精密組件的協同優化。晶振,作為為手機各系統提供穩定時鐘信號的關鍵元件&…

Android 接口定義語言 (AIDL)

目錄 1. 本地進程調用(同一進程內)2. 遠程進程調用(跨進程)3 `oneway` 關鍵字用于修改遠程調用的行為Android 接口定義語言 (AIDL) 與其他 IDL 類似: 你可以利用它定義客戶端與服務均認可的編程接口,以便二者使用進程間通信 (IPC) 進行相互通信。 在 Android 上,一個進…

關于QT5項目只生成一個CmakeLists.txt文件

編譯器自動檢測明明可以檢測,Kit也沒有報紅 但是最后生成項目只有一個文件 一:檢查cmake版本,我4.1版本cmake一直報錯 cmake3.10可以用 解決之后還是有問題 把環境變量加上去:

uniapp小程序位置授權彈框與隱私協議耦合(合而為一)(只在真機上有用,模擬器會分開彈 )

注意: 只在真機上有用,模擬器會分開彈 效果圖: 模擬器效果圖(授權框跟隱私政策會分開彈,先彈隱私政策,同意再彈授權彈框): manifest-template.json配置( "__usePr…

[Godot] C#人物移動抖動解決方案

在寫一個2D平臺跳躍的游戲代碼發現,移動的時候會抖動卡頓的厲害,后來研究了一下抖動問題,有了幾種解決方案 1.垂直同步和物理插值問題 這是最常見的可能導致畫面撕裂和抖動的原因,大家可以根據自己的需要調整項目設置&#xff0…

紅帽Linux網頁訪問問題

配置網絡,手動配置 搭建yum倉庫紅帽Linux網頁訪問問題 下載httpd 網頁訪問問題:首先看httpd的狀態---selinux的工作模式(強制)---上下文類型(semanage-fcontext)---selinux端口有沒有放行semanage port ---防火墻有沒有active---…

Android12編譯x86模擬器報找不到userdata-qemu.img

qemu-system-x86_64: Could not open out/target/product/generic_x86_64/userdata-qemu.img: No such file or directory 選擇編譯aosp_x86-eng時沒有生成模擬器,報 qemu-system-x86_64: Could not open out/target/product/generic_x86_64/userdata-qemu.img: No…

【AI論文】PixelFlow:基于流的像素空間生成模型

摘要:我們提出PixelFlow,這是一系列直接在原始像素空間中運行的圖像生成模型,與主流的潛在空間模型形成對比。這種方法通過消除對預訓練變分自編碼器(VAE)的需求,并使整個模型能夠端到端訓練,從…

AI大模型學習九:?Sealos cloud+k8s云操作系統私有化一鍵安裝腳本部署完美教程(單節點)

一、說明 ?Sealos?是一款基于Kubernetes(K8s)的云操作系統發行版,它將K8s以及常見的分布式應用如Docker、Dashboard、Ingress等進行了集成和封裝,使得用戶可以在不深入了解復雜的K8s底層原理的情況下,快速搭建起一個…

【HDFS入門】HDFS核心組件DataNode詳解:角色職責、存儲機制與健康管理

目錄 1 DataNode的角色定位 2 DataNode的核心職責 2.1 數據塊管理 2.2 與NameNode的協作 3 DataNode的存儲機制 3.1 數據存儲目錄結構 3.2 數據塊文件組織 4 DataNode的工作流程 4.1 數據寫入流程 4.2 數據讀取流程 5 DataNode的健康管理 5.1 心跳機制(…

BufferedOutputStream 終極解析與記憶指南

BufferedOutputStream 終極解析與記憶指南 一、核心本質 BufferedOutputStream 是 Java 提供的緩沖字節輸出流,繼承自 FilterOutputStream,通過內存緩沖區顯著提升 I/O 性能。 核心特性速查表 特性說明繼承鏈OutputStream → FilterOutputStream → …

光纖模塊全解:深入了解XFP、SFP、QSFP28等類型

隨著信息技術的快速發展,數據中心和網絡的帶寬需求不斷提高,光纖模塊的選擇與應用顯得尤為重要。光纖模塊是實現高速網絡連接的重要組件,選擇合適的模塊能夠顯著提升傳輸性能、降低延遲。本文將深入解析幾種常見的光纖模塊類型,包…

【高階數據結構】第三彈---圖的存儲與遍歷詳解:鄰接表構建與鄰接矩陣的BFS/DFS實現

?個人主頁: 熬夜學編程的小林 💗系列專欄: 【C語言詳解】 【數據結構詳解】【C詳解】【Linux系統編程】【高階數據結構】 目錄 1、圖的存儲結構 1.1、鄰接表 1.1.1、邊的結構 1.1.2、圖的基本結構 1.1.3、圖的創建 1.1.4、獲取頂點下…