ES6 Reflect
阿新 • • 發佈:2020-10-18
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; } });