TypeScript 裝飾器

詳情可查看官方網(wǎng)址;https://www.tslang.cn/docs/handbook/decorators.html

image.png
tsc --target ES5 --experimentalDecorators

實(shí)例

簡(jiǎn)單的使用裝飾器

  • app.ts
//簡(jiǎn)單的使用裝飾器
//定義下面的裝飾器所指代的函數(shù)
//taget 是被修飾的傳進(jìn)來(lái)的參數(shù)
function hello(target) {
    console.log('xiaochuan');
}
//裝飾器的聲明方法 @+裝飾器的名稱
//下面是用裝飾器去裝飾一個(gè)類
@hello
class xiaochuan{

}
  • HTML
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>TypeScript 裝飾器</title>
</head>
<body>
    <script type="text/javascript" src="app.js"></script>
</body>
</html>
  • 命令行中的執(zhí)行命令與之前的也有所差異
tsc --target ES5 --experimentalDecorators app.ts
  • 瀏覽器效果圖
image.png
  • 總結(jié):

上面的示例輸出了 xiaochuan ,但是我們并沒(méi)有在代碼中去調(diào)用這個(gè)方法,我們是使用了這個(gè)裝飾器 hello 去裝飾 xiaochuan 這個(gè)類,從而成功的打印出了上面的效果

使用裝飾器工廠函數(shù)

//需求:定制一個(gè)裝飾器應(yīng)用到聲明上
//使用裝飾器工廠函數(shù) 裝飾器工廠實(shí)際上就是一個(gè)函數(shù)
function color(value: string) { // 這是一個(gè)裝飾器工廠
    return function (target) { //  這是裝飾器
        // do something with "target" and "value"...
    }
}

多個(gè)裝飾器的定義方法

//需求:定義一個(gè)函數(shù) 他的里面不止有一個(gè)裝飾器
//下面示例是 定義了 f 和 g 兩個(gè)裝飾器去裝飾 x
@f @g x//單行的寫法
//多行的寫法
@f
@g
x

多個(gè)裝飾器的執(zhí)行順序

//如何知道多個(gè)裝飾器的執(zhí)行順序?
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() {}
}
  • 瀏覽器效果圖
image.png
  • 總結(jié):

上面的執(zhí)行其實(shí)是按照這樣的邏輯來(lái)的:
f 先執(zhí)行他將 g 包裹在里面 g 里面包裹的是 x f(g(x))

類裝飾器

// 我們可以這樣定義@sealed裝飾器:
function sealed(constructor: Function) {
    Object.seal(constructor);
    Object.seal(constructor.prototype);
}
// 下面是使用類裝飾器(@sealed)的例子,應(yīng)用在Greeter類:
@sealed
class Greeter {
    greeting: string;
    constructor(message: string) {
        this.greeting = message;
    }
    greet() {
        return "Hello, " + this.greeting;
    }
}
  • 總結(jié):

當(dāng)@sealed被執(zhí)行的時(shí)候,它將密封此類的構(gòu)造函數(shù)和原型。(注:參見(jiàn)Object.seal)

方法裝飾器

//下面是一個(gè)方法裝飾器(@enumerable)的例子
//我們可以用下面的函數(shù)聲明來(lái)定義@enumerable裝飾器:
function enumerable(value: boolean) {
    return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {//PropertyDescriptor 是屬性描述器
        descriptor.enumerable = value;
        console.log(descriptor.enumerable);
    };
}

class Greeter {
    greeting: string;
    constructor(message: string) {
        this.greeting = message;
    }

    @enumerable(false)
    greet() {
        return "Hello, " + this.greeting;
    }
}
//上面類中的@enumerable(false)是一個(gè)裝飾器工廠。 當(dāng)裝飾器 @enumerable(false)被調(diào)用時(shí),它會(huì)修改屬性描述符 descriptor 的enumerable屬性。
  • 瀏覽器效果圖
image.png

訪問(wèn)器裝飾器

// 我們可以通過(guò)如下函數(shù)聲明來(lái)定義@configurable裝飾器:
function configurable(value: boolean) {
    return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
        descriptor.configurable = value;
    };
}
// 下面是使用了訪問(wèn)器裝飾器(@configurable)的例子,應(yīng)用于Point類的成員上:
class Point {
    private _x: number;
    private _y: number;
    constructor(x: number, y: number) {
        this._x = x;
        this._y = y;
    }

    @configurable(false)
    get x() { return this._x; }

    @configurable(false)
    get y() { return this._y; }
}

屬性裝飾器

function configurable(value: boolean) {
    return function (target: any, propertyKey: string) {
        console.log('屬性:',value);
    };
}
class Hello{
    @configurable(false)//這里在執(zhí)行值會(huì)直接在控制臺(tái)輸出一個(gè) false
    name:string;
}

參數(shù)裝飾器

function require(value: boolean) {
    return function (target: any, propertyKey: string,index:number) {//index 是增加的索引參數(shù)
        console.log('參數(shù):',value);
    };
}
class Hello{
    xiaochuan(@require(false) age:number){

    }
}
?著作權(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),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,139評(píng)論 25 708
  • 裝飾器是一種特殊類型的聲明,它可以用在類聲明、方法、屬性或者參數(shù)上。顧名思義,它是用來(lái)給附著的主體進(jìn)行裝飾,添加額...
    河的左岸閱讀 5,892評(píng)論 0 4
  • 裝飾器主要用于將一些常用操作進(jìn)行抽象出一層對(duì)類,方法,屬性,參數(shù)進(jìn)行修飾的函數(shù)。常用例子:設(shè)置屬性時(shí),打日志等。 ...
    方大米閱讀 801評(píng)論 0 1
  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程,因...
    小菜c閱讀 7,355評(píng)論 0 17
  • 關(guān)于學(xué)習(xí)方法論三個(gè)要點(diǎn) 一、保持自己的節(jié)奏(心態(tài)平和,學(xué)習(xí)復(fù)盤) 二、做好固化(精神上,物質(zhì)上) 三、循序漸進(jìn)(勞...
    a0001911cc5a閱讀 422評(píng)論 0 2

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