翻譯過來是反射的意思,與
Reflect
對象一樣,也是
Proxy
為了操作對象而提供的新
ES6
。有一下幾個作用
API
- 将
對象的一些明顯屬于語言内部的方法(比如Object
),放到Object.defineProperty
對象上。現階段,某些方法同時在Reflect
和Object
對象上部署,未來的新方法将隻部署在Reflect
對象上。也就是說,從Reflect
對象上可以拿到語言内部的方法。Reflect
- 修改某些
方法的傳回結果,讓其變得更合理。比如,Object
在無法定義屬性時,會抛出一個錯誤,而Object.defineProperty(obj, name, desc)
則會傳回Reflect.defineProperty(obj, name, desc)
。false
// 老寫法
try {
Object.defineProperty(target, property, attributes);
// success
} catch (e) {
// failure
}
// 新寫法
if (Reflect.defineProperty(target, property, attributes)) { // 成功傳回true
// success
} else {
// failure
}
讓
Object
操作都變成函數行為。某些
Object
操作是指令式,比如
name in obj
delete obj[name]
,而
Reflect.has(obj, name)
Reflect.deleteProperty(obj, name)
讓它們變成了函數行為。
// 老寫法
'assign' in Object // true
// 新寫法
Reflect.has(Object, 'assign') // true
Reflect
對象的方法與
Proxy
對象的方法一一對應,隻要是
Proxy
對象的方法,就能在
Reflect
對象上找到對應的方法。這就讓Proxy對象可以友善地調用對應的
Reflect
方法,完成預設行為,作為修改行為的基礎。也就是說,不管
Proxy
怎麼修改預設行為,你總可以在
Reflect
上擷取預設行為。
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;
}
});