装饰器的本质是一个函数,一共有以下四种
const a:ClassDecorator = (tar:any) =>{
// 使用装饰器a后的类会作为参数传进来
console.log(tar);
// 可以通过原型去给tar(也就是给A)添加属性,这么做的好处是可以不用去破坏A的结构
tar.prototype.name = '我是a'
}
@a
class A{
constructor(){
}
}
const aa:any = new A()
console.log(aa.name);
// 属性装饰器
const b:PropertyDecorator = (tar:any,key:string|symbol) =>{
// 使用装饰器b后的B会作为引用对象传给tar,属性b作为参数传给key
console.log(tar,key);
}
class B{
@b
public b:string
constructor(){
this.b = 'bb'
}
}
// 方法装饰器
const c:MethodDecorator = (tar:any,key:string|symbol,descriptor:any) =>{
// 使用装饰器b后的B会作为引用对象传给tar,方法名getName作为参数传给key,方法的描述传给descriptor
console.log(tar,key,descriptor);
}
class C{
constructor(){
}
@c
getName(){}
}
// 参数装饰器
const d:ParameterDecorator = (tar:any,key:string|symbol,index:number) =>{
// 使用装饰器b后的B会作为引用对象传给tar,方法名getName作为参数传给key,参数的索引传给index
console.log(tar,key,index);
}
class D{
constructor(){
}
getName(@d name:string){}
}