更新時間:2025-09-03 21:11:14作者:佚名
[]
該實體與代理類似,也是 ES6 為處理對象而新增的一種機制。它的構建意圖包含多個方面。
將對象的部分顯著屬于語言體系的方法(諸如點號操作),遷移至對象本身,當前某些方法既在對象上存在,也部署在語言核心,往后新增的方法將僅部署在對象層面,換言之,對象本身能夠獲取語言體系內的方法。
調整部分函數的輸出,使其更為恰當。舉例來說reflect是什么意思留學之路,當嘗試設定某個屬性卻無法成功時,一個函數會觸發異常,而另一個函數則會產生一個假值。
// 老寫法
try {
Object.defineProperty(target, property, attributes);
// success
} catch (e) {
// failure
}
// 新寫法
if (Reflect.defineProperty(target, property, attributes)) {
// success
} else {
// failure
}
讓所有操作都以函數形式執行。部分操作具有指令式特征,例如name屬于obj以及obj,而.has(obj, name)和.(obj, name)則將它們轉化為函數調用方式。
// 老寫法
'assign' in Object // true
// 新寫法
Reflect.has(Object, 'assign') // true
對象上的方法與Proxy對象的方法逐項匹配,只要Proxy對象擁有某個方法,那么在對象中也必然存在相應的方法。這種對應關系使得Proxy對象能夠便捷地調用對象中的方法,以實現預設的默認操作,并為后續的行為調整提供依據。換句話說,即便Proxy對象對默認行為進行了調整,依然可以從對象中檢索到原始的默認行為。
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技術把數值安放到對象屬性之中,務必要讓原本的動作得以實現,隨后再附加其他作用。
下面是另一個例子。
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是什么意思,都通過對應的方法實現,確保原始功能不受影響?,F在需要做的,是為每個操作打印一條記錄信息。
有了對象以后,很多操作會更易讀。
// 老寫法
Function.prototype.apply.call(Math.floor, undefined, [1.75]) // 1
// 新寫法
Reflect.apply(Math.floor, undefined, [1.75]) // 1