装饰器:是一种特殊的类型声明,它能够被附加到类声明,方法,属性或参数上。可以修改类的行为。
通俗来讲装饰器就是一个方法,可以注入到类、方法、属性参数上来扩展类,属性,方法,参数的功能。
常见的装饰器有:类装饰器,属性装饰器,方法装饰器,参数装饰器。
装饰器额写法:普通装饰器(无法传参),装饰器工厂(可传参)。
装饰器是过去js中最大的成就之一,已经是ES7的标准之一。
所谓装饰器就是在不修改类,函数,对象的前提下对其拓展。装饰装饰,就是在不修改主体结构的前提下对其进行拓展。
一、类装饰器
功能:在不修改类的前提下动态的扩展类的功能。
function logClass(params:any){
console.log(params);
// parmas就是当前类
params.prototype.name="cheng"
}
@logClass
class 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")
}
}
}
@logClass
class 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")
}
}
}
@logClass
class HttpClient{
constructor(){
}
getData(){
console.log("parent")
}
}
var a:any = new HttpClient();
a.getData();