装饰器

71 阅读1分钟

装饰器的本质是一个函数,一共有以下四种

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){}
}