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í)有所幫助,也希望大家多多支持腳本之家。
- TypeScript裝飾器的作用、結(jié)構(gòu)、類型及其應(yīng)用場(chǎng)景(代碼示例)
- 使用TypeScript和裝飾器實(shí)現(xiàn)前端數(shù)據(jù)脫敏
- TypeScript裝飾器之項(xiàng)目數(shù)據(jù)轉(zhuǎn)換詳解
- TypeScript裝飾器與反射元數(shù)據(jù)實(shí)例詳解
- TypeScript入門之利用裝飾器擴(kuò)展代碼能力
- Typescript使用裝飾器實(shí)現(xiàn)接口字段映射與Mock實(shí)例
- Typescript裝飾器AOP示例詳解
- TypeScript 裝飾器定義
- 淺談Typescript 裝飾器執(zhí)行順序
相關(guān)文章
Javascript實(shí)例教程(19) 使用HoTMetal(3)
Javascript實(shí)例教程(19) 使用HoTMetal(3)...2006-12-12
Javascript全局變量var與不var的區(qū)別深入解析
這篇文章主要介紹了Javascript全局變量var與不var的區(qū)別。需要的朋友可以過來參考下,希望對(duì)大家有所幫助2013-12-12
簡(jiǎn)單學(xué)習(xí)JavaScript中的for語(yǔ)句循環(huán)結(jié)構(gòu)
這篇文章主要介紹了簡(jiǎn)單學(xué)習(xí)JavaScript中的for語(yǔ)句循環(huán)結(jié)構(gòu),是JavaScript入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-11-11
javascript基礎(chǔ)第一章 JavaScript與用戶端
javascript基礎(chǔ)第一章 JavaScript與用戶端2010-07-07
JavaScript DOM學(xué)習(xí)第八章 表單錯(cuò)誤提示
這一章詳細(xì)介紹的表單錯(cuò)誤提示的方法比那種大多數(shù)使用警告框的方法要好的多。2010-02-02
document.all的一個(gè)比較完整的總結(jié)及案例
document.all想必學(xué)習(xí)javascript的同學(xué)們都很了解吧,本文主要是針對(duì)一些剛?cè)腴T的童鞋們做一下有關(guān)document.all的相關(guān)總結(jié),感興趣的朋友可以了解下,或許本文對(duì)你有所幫助2013-01-01

