ES6 proxy和reflect的使用方法與應(yīng)用實例分析
本文實例講述了ES6 proxy和reflect的使用方法。分享給大家供大家參考,具體如下:
proxy和reflect都是es6為了更好的操作對象而提供的新的API,接下來探討一下二者的作用,聯(lián)系。
設(shè)計proxy,reflect的作用:
proxy的作用:
Proxy的設(shè)計目的在于(修改編程語言),修改某些操作方法的默認行為,
等同于在語言層面作出修改,是元編程(meta programming) 例如修改set,get方法
reflect的作用:
1,映射一些明顯屬于對象語言內(nèi)部的方法,目前是共存于Object和Reflect上,未來只在Reflect上
2,修改一些Object上的方法返回的結(jié)果,減少異常拋出,使其變得更加合理
3,讓Object操作都變成函數(shù)行為(主要的作用)
4,Reflect對象的方法與Proxy對象的方法一一對應(yīng)(主要的作用)
proxy和reflect的方法:
proxy的實例方法:
| get() | set() | apply() | has() | cunstruct() | deleteProperty() | defineProperty() |
| getOwnPropertyDescriptor() | getPrototypeOf() | isExtensible() | ownKeys(), | preventExtensions() | setPrototypeOf() |
var person = {
name: "張三"
};
var proxy = new Proxy(person, {
get: function(target, property) {
if (property in target) {
return target[property];
} else {
throw new ReferenceError("Property \"" + property + "\" does not exist.");
}
}
});
注:目標對象內(nèi)部的this關(guān)鍵字會指向 Proxy 代理
自身方法:Proxy.revocable方法返回一個可取消的 Proxy 實例
reflect的靜態(tài)方法:
和proxy相對應(yīng),reflect有13個靜態(tài)方法,分別一一對應(yīng)于proxy的實例方法
| Reflect.apply(target, thisArg, args) | Reflect.construct(target, args) |
| Reflect.get(target, name, receiver) | Reflect.set(target, name, value, receiver) |
| Reflect.defineProperty(target, name, desc) | Reflect.deleteProperty(target, name) |
| Reflect.has(target, name) | Reflect.ownKeys(target) |
| Reflect.isExtensible(target) | Reflect.preventExtensions(target) |
| Reflect.getOwnPropertyDescriptor(target, name) | Reflect.getPrototypeOf(target) |
| Reflect.setPrototypeOf(target, prototype) |
proxy和reflect聯(lián)系:proxy的實例方法和reflect的靜態(tài)方法一一對應(yīng)
實例:觀察者模式的實現(xiàn)
const queuedObservers = new Set();
const observe = fn => queuedObservers.add(fn);//接收一個函數(shù)fn
const observable = obj => new Proxy(obj, {set});//接收一個對象obj,采用set函數(shù)攔截設(shè)置obj
function set(target, key, value, receiver) {
const result = Reflect.set(target, key, value, receiver);
queuedObservers.forEach(observer => observer());
return result;
}
感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行效果。
更多關(guān)于JavaScript相關(guān)內(nèi)容可查看本站專題:《JavaScript操作DOM技巧總結(jié)》、《JavaScript頁面元素操作技巧總結(jié)》、《JavaScript事件相關(guān)操作與技巧大全》、《JavaScript查找算法技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript錯誤與調(diào)試技巧總結(jié)》
希望本文所述對大家JavaScript程序設(shè)計有所幫助。
相關(guān)文章
基于JavaScript編寫一個圖片轉(zhuǎn)PDF轉(zhuǎn)換器
本文為大家介紹了一個簡單的 JavaScript 項目,可以將圖片轉(zhuǎn)換為 PDF 文件。你可以從本地選擇任何一張圖片,只需點擊一下即可將其轉(zhuǎn)換為 PDF 文件,感興趣的可以動手嘗試一下2022-07-07
微信小程序?qū)崿F(xiàn)搜索功能并跳轉(zhuǎn)搜索結(jié)果頁面
這篇文章主要為大家詳細介紹了微信小程序?qū)崿F(xiàn)搜索功能并跳轉(zhuǎn)搜索結(jié)果頁面,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-05-05
從數(shù)據(jù)庫讀取數(shù)據(jù)后將其輸出成html標簽的三種方法
需要輸出成html標簽時編譯器卻自動幫我們輸出成字符串,這該怎么辦?下面有個三個解決方法,一一測試便知其效果是如何2014-10-10
Object的相關(guān)方法 和 js遍歷對象的常用方法總結(jié)
這篇文章主要介紹了Object的相關(guān)方法 和 js遍歷對象的常用方法,結(jié)合實例形式總結(jié)分析了Object對象操作的操作方法與js遍歷的三種常用方法,需要的朋友可以參考下2023-05-05
javascript offsetX與layerX區(qū)別
FF沒有offsetX屬性,有個layerX屬性,只要將事件源的位置設(shè)置成相對定位(position:relative)或絕對定位(position:absolute),兩者結(jié)果就相等,表示事件源相對于父元素的X坐標。2010-03-03

