天天看點

ES6 Reflect

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;
  }
});