TypeScript中的裝飾器用法
一、裝飾器
裝飾器是一種特殊類型的聲明,它能夠被附加到類聲明,方法,屬性或參數(shù)上,可以修改類的行為。
通俗的講裝飾器就是一個(gè)方法,可以注入到類、方法、屬性參數(shù)上來擴(kuò)展類、屬性、方法、參數(shù)的功能。
常見的裝飾器有:類裝飾器、屬性裝飾器、方法裝飾器、參數(shù)裝飾器
裝飾器的寫法:普通裝飾器(無法傳參) 、 裝飾器工廠(可傳參)
裝飾器是過去幾年中js最大的成就之一,已是Es7的標(biāo)準(zhǔn)特性之一
二、類裝飾器:
類裝飾器在類聲明之前被聲明(緊靠著類聲明)。
類裝飾器應(yīng)用于類構(gòu)造函數(shù),可以用來監(jiān)視,修改或替換類定義。 傳入一個(gè)參數(shù)
1、 類裝飾器:普通裝飾器(無法傳參)
function logClass(params: any) { console.log(params); // params 就是當(dāng)前類 params.prototype.apiUrl = '動(dòng)態(tài)擴(kuò)展的屬性'; params.prototype.run = function () { console.log('我是一個(gè)run方法'); } } @logClass class HttpClient { constructor() { } getData() { } } var http: any = new HttpClient(); console.log(http.apiUrl); http.run();
2、 類裝飾器:裝飾器工廠(可傳參)
function logClass(params: string) { return function (target: any) { console.log(target); console.log(params); target.prototype.apiUrl = params; } } @logClass('http://www.itying.com/api') class HttpClient { constructor() { } getData() { } } var http: any = new HttpClient(); console.log(http.apiUrl);
下面是一個(gè)用類裝飾器重載構(gòu)造函數(shù)的例子。
類裝飾器表達(dá)式會(huì)在運(yùn)行時(shí)當(dāng)作函數(shù)被調(diào)用,類的構(gòu)造函數(shù)作為其唯一的參數(shù)。
如果類裝飾器返回一個(gè)值,它會(huì)使用提供的構(gòu)造函數(shù)來替換類的聲明。
function logClass(target: any) { console.log(target); return class extends target { apiUrl: any = '我是修改后的數(shù)據(jù)'; getData() { this.apiUrl = this.apiUrl + '----'; console.log(this.apiUrl); } } } @logClass class HttpClient { public apiUrl: string | undefined; constructor() { this.apiUrl = '我是構(gòu)造函數(shù)里面的apiUrl'; } getData() { console.log(this.apiUrl); } } var http = new HttpClient(); http.getData();
三、屬性裝飾器
屬性裝飾器表達(dá)式會(huì)在運(yùn)行時(shí)當(dāng)作函數(shù)被調(diào)用,傳入下列2個(gè)參數(shù):
1、對(duì)于靜態(tài)成員來說是類的構(gòu)造函數(shù),對(duì)于實(shí)例成員是類的原型對(duì)象。
2、成員的名字。
//類裝飾器 function logClass(params: string) { return function (target: any) { // console.log(target); // console.log(params); } } //屬性裝飾器 function logProperty(params: any) { return function (target: any, attr: any) { console.log(target); console.log(attr); target[attr] = params; } } @logClass('xxxx') class HttpClient { @logProperty('http://itying.com') public url: any | undefined; constructor() { } getData() { console.log(this.url); } } var http = new HttpClient(); http.getData();
四、方法裝飾器
它會(huì)被應(yīng)用到方法的 屬性描述符上,可以用來監(jiān)視,修改或者替換方法定義。
方法裝飾會(huì)在運(yùn)行時(shí)傳入下列3個(gè)參數(shù):
1、對(duì)于靜態(tài)成員來說是類的構(gòu)造函數(shù),對(duì)于實(shí)例成員是類的原型對(duì)象。
2、成員的名字。
3、成員的屬性描述符。
五、方法參數(shù)裝飾器
參數(shù)裝飾器表達(dá)式會(huì)在運(yùn)行時(shí)當(dāng)作函數(shù)被調(diào)用,傳入下列3個(gè)參數(shù):
1、對(duì)于靜態(tài)成員來說是類的構(gòu)造函數(shù),對(duì)于實(shí)例成員是類的原型對(duì)象。
2、參數(shù)的名字。
3、參數(shù)在函數(shù)參數(shù)列表中的索引。
到此這篇關(guān)于TypeScript裝飾器的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript 學(xué)習(xí)筆記 Black.Caffeine 09.11.28
這兩天終于寫出了一個(gè)個(gè)人認(rèn)為真正意義上的作業(yè)了,不過,最大感受就是。。。IE太垃圾了。。。so,這個(gè)作業(yè)實(shí)際上也沒有完成的很完美,因?yàn)椋贗E上還是有兼容性的問題存在,不錯(cuò),就此先自我總結(jié)一下吧~免得以后又忘了~2009-11-11一個(gè)可以兼容IE FF的加為首頁與加入收藏實(shí)現(xiàn)代碼
一個(gè)可以兼容IE FF的加為首頁與加入收藏 好不容易找到,收藏起來。2009-11-11javascript cookie用法基礎(chǔ)教程(概念,設(shè)置,讀取及刪除)
這篇文章主要介紹了javascript cookie用法,結(jié)合實(shí)例形式總結(jié)分析了javascript中cookie的定義、特點(diǎn)及獲取、設(shè)置、刪除等基本操作技巧,需要的朋友可以參考下2016-09-09JavaScript函數(shù)表達(dá)式詳解及實(shí)例
這篇文章主要介紹了JavaScript函數(shù)表達(dá)式詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05