JavaScript Proxy基本用法詳解
1.語(yǔ)法
const proxy = new Proxy(target, handle);
- target,被代理的對(duì)象
- handle,攔截規(guī)則
2.基本用法
const obj = {};
const proxy = new Proxy(obj, {
// target 目標(biāo)對(duì)象;propKey 屬性名;receiver 實(shí)例本身;
get: function(target, propKey, receiver) {
return 10;
}
})
console.log(proxy.a); // 10
console.log(proxy.b); // 10
console.log(obj.a); // undefined
console.log(obj.b); // undefined
? 以上代碼對(duì)obj對(duì)象的get操作進(jìn)行了攔截,任何讀取操作都僅會(huì)返回10,且該操作只作用在代理對(duì)象proxy上,對(duì)原對(duì)象本身是不起作用的。
ps.若obj對(duì)象是不可寫(xiě)及不可配置的,代理對(duì)象的返回值要與被代理對(duì)象的返回值保持一致;若被代理對(duì)象沒(méi)有配置get方位方法,即get方法是undefined,那么返回值必須是undefined
handle對(duì)象的常用方法:
| 方法 | 描述 |
|---|---|
| has | in操作符捕捉器 |
| get | 屬性讀取操作符捕捉器 |
| set | 屬性設(shè)置操作符讀取器 |
| deleteProperty | delete操作符讀取器 |
| ownKeys | Object.getOwnPropertyNames 方法和 Object.getOwnPropertySymbols 方法的捕捉器。 |
| apply | 函數(shù)調(diào)用捕捉器 |
| construct | new操作符的捕捉器 |
3.可消除的Proxy
? Proxy有一個(gè)唯一的靜態(tài)方法Proxy.revocable(target, handler),可以用來(lái)創(chuàng)建一個(gè)可撤銷(xiāo)的代理對(duì)象,該方法的返回值是一個(gè)對(duì)象,其結(jié)構(gòu)為: {"proxy": proxy, "revoke": revoke}。
- proxy 表示新生成的代理對(duì)象本身,和用一般方式 new Proxy(target, handler) 創(chuàng)建的代理對(duì)象沒(méi)什么不同,只是它可以被撤銷(xiāo)掉。
- revoke 撤銷(xiāo)方法,調(diào)用的時(shí)候不需要加任何參數(shù),就可以撤銷(xiāo)掉和它一起生成的那個(gè)代理對(duì)象。
ps.該方法常用于完全封閉對(duì)目標(biāo)對(duì)象的訪問(wèn)。
4.Vue為什么要用Proxy重構(gòu)
? Vue3.0之前,雙向綁定主要是由defineProperty實(shí)現(xiàn)的。而defineProperty這個(gè)方法本身其實(shí)是存在不足的,比如說(shuō)對(duì)于對(duì)象屬性增加、數(shù)組按下標(biāo)修改等一下操作無(wú)法做到原生實(shí)現(xiàn)。雖然Vue有提供相應(yīng)的手動(dòng)observer方法,但在使用體驗(yàn)上還是不盡如人意的。而想較于defineProperty針對(duì)屬性進(jìn)行攔截,Proxy直接劫持了整個(gè)對(duì)象,即不需要對(duì)特殊的操作做單獨(dú)處理。
5.Proxy與defineProperty的對(duì)比
(1)Proxy作為新標(biāo)準(zhǔn),瀏覽器支持良好
(2)Proxy能觀察的類(lèi)型比defineProperty 更豐富
(3)Proxy不兼容IE,也沒(méi)有polyfill,defineProperty 可以支持到IE9
(4)defineProperty 劫持對(duì)象的屬性,當(dāng)新增屬性時(shí),需要再次defineProperty;Proxy直接劫持整個(gè)對(duì)象,不需要額外操作。
(5)defineProperty 在原對(duì)象本身進(jìn)行攔截操作,而Proxy只能在生成的攔截的對(duì)象上進(jìn)行攔截操作。
到此這篇關(guān)于JavaScript Proxy基本用法詳解的文章就介紹到這了,更多相關(guān)JS Proxy內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談layui框架自帶分頁(yè)和表格重載的接口解析問(wèn)題
今天小編就為大家分享一篇淺談layui框架自帶分頁(yè)和表格重載的接口解析問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09
Javascript類(lèi)型系統(tǒng)之undefined和null淺析
這篇文章主要介紹了Javascript類(lèi)型系統(tǒng)之undefined和null的知識(shí),通過(guò)本文還簡(jiǎn)單給大家介紹了javascript中null和undefined的區(qū)別的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07
uniapp制作一個(gè)收縮通訊錄的實(shí)現(xiàn)代碼
這篇文章主要介紹了uniapp制作一個(gè)收縮通訊錄的實(shí)現(xiàn)代碼,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-12-12
JavaScript中Array.map()的使用與技巧分享(附實(shí)際應(yīng)用代碼)
Array.map()適合需要返回新數(shù)組、進(jìn)行鏈?zhǔn)秸{(diào)用或不修改原數(shù)組的場(chǎng)景,它與forEach()的區(qū)別在于有返回值,基本語(yǔ)法中,callback函數(shù)處理每個(gè)元素并返回新值,本文介紹了JavaScript中Array.map()的使用與技巧分享(附實(shí)際應(yīng)用代碼),需要的朋友可以參考下2025-02-02
基于JS實(shí)現(xiàn)導(dǎo)航條之調(diào)用網(wǎng)頁(yè)助手小精靈的方法
在網(wǎng)站中加入網(wǎng)頁(yè)助手小精靈,當(dāng)用戶訪問(wèn)網(wǎng)站時(shí),向用戶問(wèn)好,或是傳遞一些網(wǎng)站的重要信息,給用戶帶來(lái)極好的體驗(yàn)感,那么基于js代碼是如何調(diào)用網(wǎng)頁(yè)助手小精靈的呢?下面跟著腳本之家小編一起學(xué)習(xí)吧2016-06-06
通過(guò)實(shí)例解析JavaScript for in及for of區(qū)別
這篇文章主要介紹了通過(guò)實(shí)例解析JavaScript for in及for of區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
js使瀏覽器窗口最大化實(shí)現(xiàn)代碼(適用于IE)
點(diǎn)擊最大化按鈕后,瀏覽器的內(nèi)容填充滿顯示器,瀏覽器窗口的邊框被擠出顯示器。而該js的最大化效果是瀏覽器的邊框在顯示器內(nèi)顯示,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下2013-08-08

