更新時間:2025-09-03 21:11:14作者:佚名
[]
該實體與代理類似,也是 ES6 為處理對象而新增的一種機制。它的構(gòu)建意圖包含多個方面。

將對象的部分顯著屬于語言體系的方法(諸如點號操作),遷移至對象本身,當前某些方法既在對象上存在,也部署在語言核心,往后新增的方法將僅部署在對象層面,換言之,對象本身能夠獲取語言體系內(nèi)的方法。
調(diào)整部分函數(shù)的輸出,使其更為恰當。舉例來說reflect是什么意思留學之路,當嘗試設定某個屬性卻無法成功時,一個函數(shù)會觸發(fā)異常,而另一個函數(shù)則會產(chǎn)生一個假值。

// 老寫法try {Object.defineProperty(target, property, attributes);// success} catch (e) {// failure}// 新寫法if (Reflect.defineProperty(target, property, attributes)) {// success} else {// failure}
讓所有操作都以函數(shù)形式執(zhí)行。部分操作具有指令式特征,例如name屬于obj以及obj,而.has(obj, name)和.(obj, name)則將它們轉(zhuǎn)化為函數(shù)調(diào)用方式。
// 老寫法'assign' in Object // true// 新寫法Reflect.has(Object, 'assign') // true

對象上的方法與Proxy對象的方法逐項匹配,只要Proxy對象擁有某個方法,那么在對象中也必然存在相應的方法。這種對應關系使得Proxy對象能夠便捷地調(diào)用對象中的方法,以實現(xiàn)預設的默認操作,并為后續(xù)的行為調(diào)整提供依據(jù)。換句話說,即便Proxy對象對默認行為進行了調(diào)整,依然可以從對象中檢索到原始的默認行為。
Proxy(target, {set: function(target, name, value, receiver) {var success = Reflect.set(target, name, value, receiver);if (success) {console.log('property ' + name + ' on ' + target + ' set to ' + value);}return success;}});
那個代碼里的Proxy方法會阻攔對象屬性值的更改動作。它借助.set技術把數(shù)值安放到對象屬性之中,務必要讓原本的動作得以實現(xiàn),隨后再附加其他作用。
下面是另一個例子。

var loggedObj = new Proxy(obj, {get(target, name) {console.log('get', target, name);return Reflect.get(target, name);},deleteProperty(target, name) {console.log('delete' + name);return Reflect.deleteProperty(target, name);},has(target, name) {console.log('has' + name);return Reflect.has(target, name);}});
上述代碼里,所有Proxy對象的攔截動作,比如獲取、檢查屬性等reflect是什么意思,都通過對應的方法實現(xiàn),確保原始功能不受影響?,F(xiàn)在需要做的,是為每個操作打印一條記錄信息。

有了對象以后,很多操作會更易讀。
// 老寫法Function.prototype.apply.call(Math.floor, undefined, [1.75]) // 1// 新寫法Reflect.apply(Math.floor, undefined, [1.75]) // 1