装饰器:是一种特殊的类型声明,它能够被附加到类声明,方法,属性或参数上。可以修改类的行为。
通俗来讲装饰器就是一个方法,可以注入到类、方法、属性参数上来扩展类,属性,方法,参数的功能。
常见的装饰器有:类装饰器,属性装饰器,方法装饰器,参数装饰器。
装饰器额写法:普通装饰器(无法传参),装饰器工厂(可传参)。
装饰器是过去js中最大的成就之一,已经是ES7的标准之一。
所谓装饰器就是在不修改类,函数,对象的前提下对其拓展。装饰装饰,就是在不修改主体结构的前提下对其进行拓展。
一、类装饰器
功能:在不修改类的前提下动态的扩展类的功能。
function logClass(params:any){console.log(params);// parmas就是当前类params.prototype.name="cheng"}@logClassclass HttpClient{constructor(){}getData(){}}var a:any = new HttpClient();console.log(a.name);}
二、装饰器工厂(带参数)
function logClass(params:string){return function(target:any){console.log(target) //[Function: HttpClient]console.log(params) //"hello"}}@logClass("hello")class HttpClient{constructor(){}getData(){}}
2-1 给HttpClient类拓展一个属性
function logClass(params:string){return function(target:any){target.prototype.apiUrl = params;}}@logClass("http://douban.uieee.com/v2")class HttpClient{constructor(){}getData(){}}var http:any = new HttpClient();console.log(http.apiUrl);
2-2 装饰器继承父类重载属性,方法
function logClass(target:any){return class extends target{apiUrl:any = "https://www.baidu.com"getData(){console.log("change")}}}@logClassclass HttpClient{public apiUrl:string|undefined;constructor(){this.apiUrl = "http://douban.uieee.com/v2"}getData(){console.log(this.apiUrl)}}
function logClass(params:any){return class extends params {getData(){console.log("child")}}}@logClassclass HttpClient{constructor(){}getData(){console.log("parent")}}var a:any = new HttpClient();a.getData();
