ES6:Reflect

Reflect

  1. 概述。

Relflect對象與Proxy對象同樣,也是ES6爲了操做對象而提供的新的API。Reflect對象的設計目的有幾個。
(1)將Object對象的一些明顯屬於語言內部的方法(好比Obejcet.defineProperty),放到Reflect對象上。現階段,某些方法同時在Object喝Reflect對象上部署,將來的新方法將只部署在Reflect對象上。也就是說,從reflect對象上能夠拿到語言內部的方法。
(2)修改某些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)){
    //success
}else{
    //failure
}

(3)讓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

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

上面代碼中,Proxy方法攔截target對象的屬性賦值行爲。它採用Reflect.set方法將值賦值給對象的屬性,確保完成原有的行爲,而後再部署額外的功能。
下面是另外一個例子。code

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對象的攔截操做(getdeletehas),內部都調用對應的Reflect方法,保證原生行爲可以正常執行。添加的工做,就是將每個操做輸出一行日誌。對象

相關文章
相關標籤/搜索