1. 程式人生 > 實用技巧 >ES6 Reflect

ES6 Reflect

Reflect翻譯過來是反射的意思,與Proxy物件一樣,也是 ES6 為了操作物件而提供的新 API。有一下幾個作用

  • Object物件的一些明顯屬於語言內部的方法(比如Object.defineProperty),放到Reflect物件上。現階段,某些方法同時在ObjectReflect物件上部署,未來的新方法將只部署在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 objdelete 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; } });