es7 javascript 修飾器

通常在JavaScript中爲了讓部分代碼延遲執行,一想起的天然是 setTimeout,好比:app

setTimeout(() => {
  // doing
}, 0);

這種代碼或許你不知道寫過多少遍,但,咱們在 setTimeout 中多數狀況下會去調用另外一個方法:函數

setTimeout(() => {
  this.fn();
}, 0);

你會發現,咱們一直都在重複寫着 setTimeout,再套用一個匿名函數,最後才真正去編寫咱們須要執行的方法。我愈來愈討厭這種寫法,總是寫着一些無關係要多餘的代碼。this

使用Angular的同窗對 @Component 不陌生,裏面大量的使用這種ES7纔會有的「修飾器」。code

修飾器是一個函數,用於修改類行爲。對象

那, 應該怎麼編寫一個更乾淨的 setTimeout,好比,我但願這樣來編寫個人timeout:ip

@timeout(1000)
fn() {
  // doing
}

this.fn();

對應的 timeout 修飾器代碼:get

// timeout.ts
export function timeout(milliseconds: number = 0) {
  return function(target, key, descriptor) {
    // value 值至關於上面示例中 `change` 方法。
    var orgMethod = descriptor.value;
    descriptor.value = function(...args) {
      setTimeout(() => {
        orgMethod.apply(this, args);
      }, milliseconds);
    };
    return descriptor;
  }
}

target:實例對象,即 IndexComponent 實例化對象。
key:方法名稱,即 fn
descriptor:對象描述,同Object.getOwnPropertyDescriptor() 。io

怎麼樣,這樣子寫的代碼是否是更酷?function

修飾器目前只能在ES7纔會有,但一些在Typescript、Babel等轉碼器已經被支持,特別是Angular2應用中更是給予很是重要的地位。並且應用範圍能夠很是廣,好比類、類方法和屬性。匿名函數

相關文章
相關標籤/搜索