ES6-修飾器

首先放一段示例代碼

@testable
class MyTestableClass {

  // ...

}

function testable(target) {
  target.isTestable = true;
}

MyTestableClass.isTestable // true

代碼中@testable即為一個(gè)修飾器??梢钥吹?,修飾器本質(zhì)上是一個(gè)函數(shù)。將類作為修飾器函數(shù)的參數(shù)傳入到函數(shù)內(nèi)部,在函數(shù)內(nèi)部為類掛載了屬性與方法。

除了在類上使用修飾器外,還可以在類內(nèi)部屬性上使用修飾器。示例如下:

class Person {
  @readonly
  name() { return `${this.first} ${this.last}` }
}

這個(gè)很好理解,表明Person類中的name屬性是只讀的。

那么readonly修飾器函數(shù)是怎樣的呢?

function readonly(target, name, descriptor){

  // descriptor對(duì)象原來的值如下

  // {

  //   value: specifiedFunction,

  //   enumerable: false,

  //   configurable: true,

  //   writable: true

  // };

  descriptor.writable = false;

  return descriptor;

}

readonly(Person.prototype, 'name', descriptor);

當(dāng)修飾器作用到類屬性上時(shí),實(shí)則將類原型作為對(duì)象傳入到了修飾器函數(shù)內(nèi)部,第二個(gè)參數(shù)即為作用的類屬性名,第三個(gè)參數(shù)是該屬性的一些默認(rèn)屬性。修改默認(rèn)屬性即可控制該類屬性的一些行為(比如說是否可復(fù)寫該方法等)。

修飾器的兩種使用方法就是上面??這些了。

注意,我們提到修飾器實(shí)則就是一個(gè)函數(shù),所以,遇到React中的這種寫法也就很好理解了

@connect(mapStateToProps, mapDispatchToProps)
function connect(mapStateToProps,mapDispatchToProps){
  return function(){}
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習(xí)記錄文檔,今天18年5月份再次想寫文章,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 3,144評(píng)論 2 9
  • 寫在前面,因?yàn)閒unction存在變量提升,所以修飾器是只能修飾類,而不能修飾函數(shù) 修飾器是一個(gè)函數(shù),用來修改類的...
    ITtian閱讀 1,943評(píng)論 0 3
  • decorator是ES7引入的功能,它是一個(gè)函數(shù),用來修改類甚至于是方法的行為。 類的修飾 一個(gè)簡單的栗子: @...
    youngss閱讀 336評(píng)論 0 0
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,673評(píng)論 1 32
  • 修飾器@ 只能用于類 和 類的方法 類的修飾器 修飾器對(duì)類的行為的改變,是代碼編譯時(shí)發(fā)生的,而不是在運(yùn)行時(shí) 方法的...
    lmmy123閱讀 1,530評(píng)論 0 0

友情鏈接更多精彩內(nèi)容