装饰器
特殊的类型声明,它能够附加到类声明,方法,属性或参数上,可以修改类的行为。
通俗的讲装饰器就是一个方法,可以注入到类、方法、属性参数上来扩展类、属性、方法、参数的功能。
常见的装饰器有:类装饰器、属性装饰器、方法装饰器、参数装饰器。
装饰器的写法:普通装饰器(无参)、装饰工厂(可传参)
装饰器是过去几年中js 最大的成就之一,已是ES7的标准特征之一。
普通类装饰器
类装饰器是在类声明之前被声明(紧靠着类声明)。类装饰器应用于类构造函数,可以用来监视,修改或者替换类定义。
//定义装饰器
function logClass(params:any){
console.log(params:any);
//这里的params 就是当前类
}
@logClass //调用装饰器
class HttpClient{
constructor(){
}
getData(){
}
}
打印结果:
那么已知是当前类,那么就可以操作该类,可以扩展,修改这个类。
//定义装饰器
function logClass(params:any){
console.log(params:any);
//这里的params 就是当前类
params.prototype.apiUrl = 'xxx';
params.prototype.run = function{
console.log("--------run---------");
}
}
@logClass //调用装饰器
class HttpClient{
constructor(){
}
getData(){
}
}
var http:any = new HttpClient();
console.log(http.apiUrl);
http.run();
带参数的类装饰器(装饰器工厂)
//定义装饰器工厂
function logClass(params:string){
return function(target:any){
console.log(target);
console.log(params);
}
target.prototype.apiUrl = params; //属性装饰器
}
@logClass("www.baidu.com") //调用装饰器
class HttpClient{
constructor(){
}
getData(){
}
}
var http:any = new HttpClient();
console.log(http.apiUrl);
通过打印可以看到,将字符串hello 赋值给了params,将对象赋值给了target.
类装饰器重载构造函数
装饰器表达式会在运行时当做函数被调用,类的构造函数作为其唯一的参数。
如果类装饰器返回一个值,他会使用提供的构造函数来替换类的声明。
function l