中級 Pro ⏱ 25:00
06-3 (付費) 物件攔截:Proxy 與 Reflect
(Pro) 掌握現代框架的核心:攔截物件行為。學習 Proxy 與 Reflect 進行數據響應式開發與高階封裝。
06-3 (付費) 物件攔截:Proxy 與 Reflect
👋 **老師的話 (Script)**:
"你是否好奇,為什麼在 Vue 或部分狀態管理工具中,
當你改了一個變數,畫面就會自動更新?
這背後的功臣就是 Proxy。
它就像在物件外面設了一個『警衛亭』,任何人想進去讀資料、改資料,
都要先經過警衛的檢查。這給了我們無窮的想像空間。“
1. Proxy (代理人)
Proxy 可以讓我們攔截物件的各種操作(讀取 get、賦值 set、刪除 deleteProperty 等)。
const target = { price: 100 };
const observer = new Proxy(target, {
set(obj, prop, value) {
if (prop === "price" && value < 0) {
throw new Error("價格不能是負數!");
}
console.log(`屬性 ${prop} 已更新為 ${value}`);
obj[prop] = value;
return true;
}
});
observer.price = 200; // ✅ 更新成功
observer.price = -50; // ❌ 報錯
2. Reflect (反射)
Reflect 是一個內建對象,它提供了攔截 JavaScript 操作的方法。
它通常與 Proxy 搭配使用,用來執行「原本該有的行為」。
const handler = {
get(target, prop, receiver) {
console.log(`正在讀取: ${prop}`);
return Reflect.get(target, prop, receiver); // 確保 this 指向正確
}
};
3. 實戰場景:自動化驗證與記錄 (Validation)
在 2026 年,我們常利用 Proxy 來建立自動驗證的 Model。
function createValidator(data, schema) {
return new Proxy(data, {
set(target, prop, value) {
const validator = schema[prop];
if (validator && !validator(value)) {
console.error(`${prop} 驗證失敗!`);
return false;
}
return Reflect.set(target, prop, value);
}
});
}
🧪 Lab 12: 響應式數據初步
請實做一個簡單的
reactive 函數,
當物件屬性被修改時,自動印出 "UI 正在重新渲染..."。