TypeScript装饰器(Decorator)

一、装饰器(Decorator)

  • 装饰器:就是一个方法,可以注入到类、方法、属性参数上来扩展类、属性、方法、参数的功能。
  • 常见的装饰器有:类装饰器、属性装饰器、方法装饰器、参数装饰器
  • 装饰器的写法:普通装饰器(无法传参) 、 装饰器工厂(可传参)
  • 装饰器是过去几年中js最大的成就之一,已是Es7的标准特性之一

二、类装饰器(无法参数)

类装饰器在类声明之前被声明(紧靠着类声明)。
类装饰器应用于类构造函数,可以用来监视,修改或替换类定义。 传入一个参数

function fun( target:any ){

    target.prototype.userName = '李四';

}

@fun
class Person{

}
let person = new Person();
//@ts-ignore
console.log( person.userName );

三、装饰器工厂(可传参)

function fun1(  options:any  ){
    return ( target:any )=>{
        target.userName = options.name;
        target.prototype.age = options.age;
    }
}
@fun1({
    name:'李四',
    age:18
})
class Obj1{ 

}
let obj1 = new Obj1();
//@ts-ignore
console.log( Obj1.userName, obj1.name , obj1.age );

四、装饰器组合

结合起来一起使用的时候, 会先 从上至下 的执行所有的装饰器工厂, 拿到所有真正的装饰器, 然后再 从下至上 的执行所有的装饰器:

function demo1( target:any ){
    console.log('demo1')
}
function demo2(  ){
    console.log('demo2')
    return ( target:any )=>{
        console.log('demo2里面')
    }
}
function demo3( ){
    console.log('demo3')
    return ( target:any )=>{
        console.log('demo3里面')
    }
}
function demo4( target:any ){
    console.log('demo4')
}

@demo1
@demo2()
@demo3()
@demo4
class Person{

}

/*结果是:
demo2
demo3
demo4
demo3里面
demo2里面
demo1
*/

五、属性装饰器

function fun3( arg:any ){
    return ( target:any , attr:any )=>{
        target[attr] = arg;
    }
}

class Obj3{
    @fun3('张三')
    //@ts-ignore
    userName:string
}   
let obj3 = new Obj3();
console.log( obj3.userName );

六、方法装饰器

function test( target: any, propertyKey: string, descriptor: PropertyDescriptor ) {
    console.log( target );
    console.log( propertyKey );
    console.log( descriptor );
}

class Person {
    @test
    sayName() {
        console.log( 'say name...' )
       return 'say name...';
    }
}

let p = new Person();
p.sayName()
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 装饰器(Decorator) 装饰器是一种特殊类型的声明,它能够附加到类声明、方法、访问符、属性、类方法的参数上,...
    时光如剑阅读 2,852评论 0 1
  • 简介 在一些框架(比如 nest.js、midway.js 等)中,经常看到在类代码的附近有 @...... 这种...
    喵巨人阅读 266评论 0 0
  • 一、什么是装饰器 装饰器是一种特殊类型的声明,它能够被附加到类声明,方法, 访问符,属性或参数上。使用 @ 符号加...
    輪徊傷阅读 442评论 0 0
  • 随着转译变得司空见惯,我们会经常在一些实际代码或教程中遇到新的语言特性。这些特性中,装饰器绝对是让人第一次碰到时会...
    shallynon阅读 7,737评论 0 2
  • 装饰器:装饰器是一种特殊类型的声明,它能够被附加到类声明,方法,属性或参数上,可以修改类的行为。通俗的讲装饰器就是...
    youah阅读 101评论 0 0