typescript裝飾器

什么是裝飾器

裝飾器是一種特殊類型的聲明,它能夠被附加到類聲明,方法,訪問符,屬性或參數(shù)上,是一種在不改變原來類和使用繼承的情況下,動態(tài)擴展對象功能。
同樣,本質(zhì)也不是什么高大上的結(jié)構,就是一個普通的函數(shù),expression的形式其實是Object.defineProperty的語法糖
expression求值后必須也是一個函數(shù),它會運行時被調(diào)用,被裝飾的聲明信息作為參數(shù)傳入

使用方式

在ts里,要是會用,需要在tsconfig.json文件啟動

{
    "compilerOptions": {
        "target": "ES5",
        "experimentalDecorators": true
    }
}

類裝飾

聲明一個函數(shù)addAge 去給Class的屬性 age添加年齡

function addAge(constructor:Function){
   constructor.prototype.age = 18
}

@addAge
class Person{
   name:string;
   age!:number;
   constructor(){
       this.name = '張三'
    }
}

let person =  new Person();

console.log(person.age) //18

方法/屬性裝飾

參數(shù)裝飾

訪問器裝飾

裝飾器工廠

執(zhí)行順序

當多個裝飾器應用于一個聲明上,將由上至下依次對裝飾器表達式求值,求值的結(jié)果會被當作函數(shù),由下至上依次調(diào)用,例如如下:

function f() {
    console.log("f(): evaluated");
    return function (target, propertyKey: string, descriptor: PropertyDescriptor) {
        console.log("f(): called");
    }
}

function g() {
    console.log("g(): evaluated");
    return function (target, propertyKey: string, descriptor: PropertyDescriptor) {
        console.log("g(): called");
    }
}

class C {
    @f()
    @g()
    method() {}
}

// 輸出
f(): evaluated
g(): evaluated
g(): called
f(): called

應用場景

可以看到,使用裝飾器存在兩個顯著的優(yōu)點:

  • 代碼可讀性變強了,裝飾器命名相當于一個注釋
  • 在不改變原有代碼情況下,對原來功能進行擴展

后面的使用場景中,借助裝飾器的特性,除了提高可讀性之后,針對已經(jīng)存在的類,可以通過裝飾器的特性,在不改變原有代碼情況下,對原來功能進行擴展

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

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

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