国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

理解ES6 Proxy:從基礎(chǔ)使用到實(shí)際場景

開發(fā) 前端
今天我們來聊聊JavaScript中的Proxy,這個功能很實(shí)用,但很多人對它還不太熟悉。

Proxy是什么?

Proxy是ES6引入的新特性,中文意思是"代理"。它的作用是在一個對象外面包一層,所有對這個對象的操作都要經(jīng)過這層代理。

簡單來說,Proxy就像一個中間人。你想訪問一個對象時,必須先經(jīng)過這個中間人同意。這個中間人可以決定是放行你的操作,還是進(jìn)行一些處理。

與之前的Object.defineProperty相比,Proxy有幾個明顯優(yōu)勢:

  • 能攔截的操作更多:可以監(jiān)聽13種不同的對象操作
  • 使用更簡單:不需要提前定義要監(jiān)聽的屬性
  • 支持的類型更廣:可以代理數(shù)組、函數(shù)等

這就是為什么vue3選擇用Proxy重寫響應(yīng)式系統(tǒng)。

Proxy的基本用法

創(chuàng)建Proxy

const proxy = newProxy(target, handler);

這里有兩個重要參數(shù):

  • target:要被代理的目標(biāo)對象
  • handler:包含各種攔截方法的對象

常用的攔截方法

  1. 讀寫屬性攔截(get和set)
const userValidator = {
set(target, prop, value) {
// 驗(yàn)證年齡數(shù)據(jù)
if (prop === 'age') {
if (!Number.isInteger(value) || value < 0 || value > 120) {
thrownew Error(`年齡無效:${value}`);
      }
    }
// 設(shè)置屬性值
    target[prop] = value;
returntrue;
  },

get(target, prop) {
// 如果屬性不存在,返回默認(rèn)值
if (!(prop in target)) {
return'未設(shè)置';
    }
return target[prop];
  }
};

const user = new Proxy({}, userValidator);
user.name = '小明'; // 正常設(shè)置
user.age = 25;     // 正常設(shè)置
console.log(user.gender); // 輸出"未設(shè)置"
user.age = 150;    // 報錯:年齡無效
  1. 函數(shù)調(diào)用攔截(apply)
const addProxy = newProxy(function(a, b) {
return a + b;
}, {
  apply(target, thisArg, args) {
console.log(`計算加法:${args[0]} + ${args[1]}`);
// 檢查參數(shù)是不是數(shù)字
if (!args.every(Number.isFinite)) {
thrownewError('參數(shù)必須是數(shù)字');
    }
return target.apply(thisArg, args);
  }
});

addProxy(2, 3);   // 輸出"計算加法:2+3",返回5
addProxy(2, '3'); // 報錯
  1. 構(gòu)造函數(shù)攔截(construct)
const UserProxy = newProxy(class{
constructor(name) {
this.name = name;
  }
}, {
  construct(target, args) {
console.log(`創(chuàng)建用戶:${args[0]}`);
// 創(chuàng)建實(shí)例并添加額外屬性
const instance = new target(...args);
    instance.createTime = newDate();
return instance;
  }
});

const user = new UserProxy('張三');
// 輸出"創(chuàng)建用戶:張三"
// user對象包含name和createTime屬性

Proxy的實(shí)際應(yīng)用場景

數(shù)據(jù)驗(yàn)證

在表單處理或配置項驗(yàn)證時很好用:

const priceHandler = {
set(target, prop, value) {
if (prop.includes('Price') && (typeofvalue !== 'number' || value <= 0)) {
thrownew Error(`價格無效:${value}`);
    }
    target[prop] = value;
returntrue;
  }
};

const product = new Proxy({ name: '手機(jī)' }, priceHandler);
product.salePrice = 2999; // 正常
product.salePrice = -100; // 報錯

響應(yīng)式編程

Vue3的響應(yīng)式系統(tǒng)就是基于Proxy:

functionreactive(target) {
returnnewProxy(target, {
    get(target, prop) {
console.log(`讀取屬性:${prop}`);
return target[prop];
    },
    set(target, prop, value) {
console.log(`設(shè)置屬性:${prop} = ${value}`);
      target[prop] = value;
returntrue;
    }
  });
}

const state = reactive({ count: 0 });
state.count++; // 輸出"讀取屬性:count"和"設(shè)置屬性:count = 1"

日志記錄

自動記錄對象操作,方便調(diào)試:

functioncreateLogger(target, name) {
returnnewProxy(target, {
    get(target, prop) {
console.log(`[${name}] 讀取屬性 ${prop}`);
return target[prop];
    },
    set(target, prop, value) {
console.log(`[${name}] 設(shè)置屬性 ${prop} = ${value}`);
      target[prop] = value;
returntrue;
    }
  });
}

const data = createLogger({ name: '李四' }, '用戶數(shù)據(jù)');
data.age = 25; // 輸出"[用戶數(shù)據(jù)] 設(shè)置屬性 age = 25"
console.log(data.name); // 輸出"[用戶數(shù)據(jù)] 讀取屬性 name"

權(quán)限控制

保護(hù)敏感數(shù)據(jù),限制某些操作:

functioncreateSecureObject(data) {
const privateKeys = ['password', 'token'];

returnnewProxy(data, {
    get(target, prop) {
if (privateKeys.includes(prop)) {
thrownewError('無權(quán)訪問私有屬性');
      }
return target[prop];
    },

    set(target, prop, value) {
if (privateKeys.includes(prop)) {
thrownewError('無權(quán)修改私有屬性');
      }
      target[prop] = value;
returntrue;
    }
  });
}

const user = createSecureObject({ 
name: '王五', 
password: '123456'
});

console.log(user.name);     // 正常
console.log(user.password); // 報錯

數(shù)組操作攔截

const arrayHandler = {
  set(target, prop, value) {
console.log(`數(shù)組操作:設(shè)置 ${prop} 為 ${value}`);
    target[prop] = value;
returntrue;
  },

  get(target, prop) {
if (prop === 'push') {
returnfunction(...args) {
console.log(`向數(shù)組添加元素:${args}`);
returnArray.prototype.push.apply(target, args);
      };
    }
return target[prop];
  }
};

const list = newProxy([], arrayHandler);
list.push('蘋果', '香蕉'); // 輸出"向數(shù)組添加元素:蘋果,香蕉"
list[0] = '橙子';          // 輸出"數(shù)組操作:設(shè)置 0 為 橙子"

使用注意事項

瀏覽器兼容性

Proxy在現(xiàn)代瀏覽器中支持很好,但不支持IE。如果需要支持老版本瀏覽器,要有備用方案。

性能考慮

Proxy會帶來一些性能開銷,但在大多數(shù)情況下影響很小。只有在性能要求極高的場景才需要考慮這個問題。

this指向

在Proxy的攔截方法中,this的指向需要注意。通常建議使用Reflect方法來保持正確的上下文。

const handler = {
get(target, prop, receiver) {
// 使用Reflect保持正確的this指向
return Reflect.get(target, prop, receiver);
  }
};

無法代理的情況

某些內(nèi)置對象(如Date、Map等)的內(nèi)部屬性無法被Proxy攔截,這是JavaScript引擎的限制。

實(shí)用技巧

鏈?zhǔn)讲僮鲾r截

const chainHandler = {
get(target, prop) {
if (prop === 'double') {
return function() {
        target.value *= 2;
return proxy; // 返回代理本身,支持鏈?zhǔn)秸{(diào)用
      };
    }
return target[prop];
  }
};

const obj = { value: 5 };
const proxy = new Proxy(obj, chainHandler);

proxy.double().double();
console.log(obj.value); // 輸出20

默認(rèn)值處理

const withDefaults = newProxy({}, {
  get(target, prop) {
if (prop in target) {
return target[prop];
    }
// 為不存在的屬性提供默認(rèn)值
if (prop === 'length') return0;
if (prop === 'timestamp') returnDate.now();
returnundefined;
  }
});

console.log(withDefaults.length);     // 輸出0
console.log(withDefaults.timestamp);  // 輸出當(dāng)前時間戳

總結(jié)

Proxy是JavaScript中很強(qiáng)大的功能,它讓我們能夠更靈活地控制對象的行為。無論是數(shù)據(jù)驗(yàn)證、日志記錄,還是實(shí)現(xiàn)響應(yīng)式系統(tǒng),Proxy都能派上用場。

雖然有一些使用限制,但在現(xiàn)代Web開發(fā)中,Proxy已經(jīng)成為不可或缺的工具。掌握好Proxy,能讓你的代碼更加健壯和靈活。

建議在實(shí)際項目中多嘗試使用Proxy,你會發(fā)現(xiàn)它在很多場景下都能簡化代碼,提高開發(fā)效率。

責(zé)任編輯:龐桂玉 來源: web前端開發(fā)
相關(guān)推薦

2025-11-25 09:24:40

2020-11-16 08:10:04

ES6迭代器JavaScript

2024-08-05 00:00:50

ES6JavaScriptClass

2016-11-14 14:52:47

vue.jses6javascript

2022-04-07 18:49:56

項目場景數(shù)據(jù)庫

2018-07-16 16:10:03

前端JavaScript面向?qū)ο?/a>

2022-10-25 08:02:01

JavaScriptArrayMap

2023-03-01 15:39:50

JavaScrip對象屬性ES6

2023-05-28 23:49:38

JavaScrip開發(fā)

2021-01-27 07:51:41

JSES6元素

2020-12-02 06:11:02

JS ES6方法

2020-03-04 17:38:31

瀏覽器程序員CSS

2021-08-16 07:05:58

ES6Promise開發(fā)語言

2024-06-26 08:18:08

ES6模板字符串

2021-07-30 07:10:07

ES6函數(shù)參數(shù)

2025-11-26 07:43:19

Java線程間場景

2023-04-11 08:35:22

RocketMQ云原生

2025-05-13 08:25:00

模塊化編程JavaScript

2023-05-10 08:21:42

Es6Set

2023-11-23 10:21:11

ECMAScriptJavaScript
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

波多野结衣之无限发射| 久久成人久久爱| 国产精品二区三区四区| 国产精品正在播放| 在线天堂视频| 日韩精品在线免费播放| 欧美日韩有码| 成人免费观看在线| 色综合 综合色| 日韩中文字幕在线一区| 波多野结衣一区二区三区在线观看 | 国产主播一区二区三区| 欧美xxxxxxxxx59| 亚洲色图狂野欧美| 欧美做受高潮电影o| 青青草国产一区二区三区| 国产欧美日韩精品专区| 99久久99久久精品国产片果冻 | 美女被人操视频在线观看| 亚洲色图五月天| 在线 亚洲欧美在线综合一区| 国产免费999| 亚洲精品v欧美精品v日韩精品| 色777狠狠狠综合伊人| 你懂的av在线| 欧美成人女星排名| 欧美精品激情| 女人体1963| 欧美高清视频在线| 国产一区二区在线网站| 日本一区二区三区四区在线视频 | 日本精品免费视频| 在线亚洲一区二区| 中文在线资源观看视频网站免费不卡| 2018av男人天堂| 日日骚久久av| 青青国产91久久久久久| 亚洲欧美日本免费| 欧美中在线观看| 久久伊99综合婷婷久久伊| 欧美另类老肥妇| 欧美一级日本a级v片| 色呦呦一区二区三区| 日本不卡电影| 在线视频网站| 国产精品久久久久久久久久久不卡 | 成人午夜免费在线视频| 日韩一级片网站| 欧美午夜在线| 亚洲国产资源| 国产美女搞久久| 香蕉av福利精品导航| 亚洲伊人春色| 黄色免费看网站| 国产91在线高潮白浆在线观看| 国产日韩av一区二区| 最新亚洲国产| 欧美日韩亚洲一二三| 久久这里有精品视频| 99久久精品国产一区| 日韩国产大片| 丁香啪啪综合成人亚洲| 欧美精品在线第一页| 91免费观看在线| 97精品资源在线观看| 免费在线观看的av网站| 超碰日本道色综合久久综合| 成人美女视频在线观看18| 久久久99精品视频| 91久久久久久久久| 国产丝袜视频一区| 欧美国产1区2区| 久久久久久久久久久久电影| 亚洲成人网在线观看| 亚洲一区日本| 日本三级韩国三级欧美三级| 亚洲欧美电影在线观看| 亚洲欧美制服第一页| 成人精品小蝌蚪| 激情久久免费视频| 4虎在线播放1区| 国产精品成人一区二区| 岛国av一区二区在线在线观看| 欧美黄色录像片| 国产黄色片在线播放| 欧美日韩最好看的视频| 亚洲小视频在线观看| 久久久噜噜噜久噜久久综合| 卡通动漫国产精品| 一起操在线观看| 久久精品magnetxturnbtih| 亚洲第一精品电影| 99久久99久久精品免费观看| 在线一级成人| 天堂а√在线资源在线| 超碰97在线看| 青草青草久热精品视频在线观看| 狠狠躁天天躁日日躁欧美| 久久精品中文| 福利一区三区| 小香蕉视频在线| 欧美一区1区三区3区公司 | 91tv亚洲精品香蕉国产一区| 成人性免费视频| 欧美与欧洲交xxxx免费观看| 欧美性生活大片免费观看网址| 天堂资源在线中文精品| 久久天堂久久| 青青久在线视频| 国产一区二区三区乱码| 午夜欧美不卡精品aaaaa| 欧美视频在线视频| 国产精品夜夜嗨| 成人在线国产| 免费在线看电影| 欧美黄色性生活| 国产一区二区久久久| 久久影院在线观看| 欧美日韩在线一区二区| 91在线观看高清| 狠久久av成人天堂| 在线视频成人| 91吃瓜网在线观看| wwwwxxxx日韩| 欧美日韩国产一二| 91精品国产免费久久久久久| 日韩一区二区三区四区五区六区| 国产视频一区在线播放| 国产日韩一区二区三区在线播放| 久久免费福利| 久久爱www久久做| 日韩一区二区三区色| 福利在线播放| 美女喷白浆视频| 色综合666| 国产精品丝袜视频| 中文字幕亚洲欧美一区二区三区| 精品国产乱码久久久久久天美| 成人午夜免费av| 亚洲激情av| 小说区图片区色综合区| 免费v片在线观看| 少妇激情av一区二区| 91成人在线观看喷潮教学| 好吊色欧美一区二区三区| 欧美性一区二区三区| 亚洲欧洲日产国码av系列天堂| 欧美日韩免费一区| 26uuuu精品一区二区| 免费久久99精品国产| 欧美黄色一区| 亚洲人成网77777色在线播放| 成人小电影网站| 美女羞羞视频在线观看| 免费看成人a| 成人性视频欧美一区二区三区| 一区二区三区观看| 精品久久久久久一区二区里番| 国产精品福利久久久| 日韩一区中文字幕| 久久影视电视剧免费网站清宫辞电视| 伊人久久99| 最近中文字幕日韩精品 | 色中色一区二区| 亚洲三级在线看| 国产日韩欧美精品在线| 激情六月婷婷久久| 亚洲在线日韩| 欧美午夜不卡| 欧美精品久久久久久| 看亚洲a级一级毛片| 性欧美18xxxhd| 色呦呦在线看| 日本视频在线播放| 国产精品一区二区三区四区色| 香蕉视频色版| 五月天亚洲激情| 日本一区二区三区国色天香| 欧美调教网站| 国产麻豆一区二区三区| 欧美三级精品| 欧美大片免费| 夜鲁夜鲁夜鲁视频在线播放| 免费网站黄在线观看| 久久精品a一级国产免视看成人| 久久午夜剧场| 欧美aaa一级| 中文字幕网在线| 亚洲日本伦理| 国产在线观看网站| 久久电影中文字幕| 国产爆初菊在线观看免费视频网站 | 一本一道久久a久久综合精品| 欧美人xxxxx| 日韩资源av在线| 亚洲一区二区在线看| 水蜜桃一区二区三区| 一本二本三本亚洲码| 青青视频免费在线| 91好吊色国产欧美日韩在线|