TypeScript 装饰器

本文详细介绍了JavaScript中的装饰器,包括普通装饰器、装饰器工厂、属性装饰器、方法装饰器和方法参数装饰器的使用方式及执行顺序。通过示例展示了如何使用装饰器动态扩展类的功能,如设置属性、修改方法行为等。
摘要由CSDN通过智能技术生成
  1. 普通装饰器
  2. function logClass(params: any) {
        console.log(params) // 当前类 [Function: HttpClient]
        params.prototype.apiUrl = 'xxx'
    }
    
    // 普通装饰器 
    @logClass
    class HttpClient {
        constructor() {
    
        }
        getData() { }
    }
    
    const http: any = new HttpClient();
    console.log(http.apiUrl) // 打印xxx

  3. 装饰器工厂
  4. namespace B {
        function logClass(params: string) {
            return function (target: any) {
                console.log(target);// 当前类 [Function: HttpClient]
                console.log(params); // 装饰器参数 welcome
                target.prototype.apiUrl = 'HTTPS';
            }
        }
        // 调用装饰器
        // 这里表示把 xiaochen 赋值给了 params,把 HttpClient类 赋值给了 target
        @logClass('welcome')
        class HttpClient {
            constructor() {
    
            }
            getData() {
    
            }
        }
        // 查看当前类的实例
        var http: any = new HttpClient();
        console.log(http.apiUrl); // 打印出动态扩展的属性  HTTPS
    }

  5. 属性装饰器
  6.    // 类装饰器
        function logClass(params: string) {
            return function (target: any) {
                console.log(target);
                console.log(params);
            }
        }
    
        // 属性装饰器
        function logProperty(params: string) {
            // target 类的原型对象
            return function (target: any, attr: any) {
                console.log(target);
                console.log(attr);
                // 属性装饰器里面的target就相当于类装饰器里面的target.prototype
                // 就是类的原型对象,就可以修改类原型对象上面的属性
                target[attr] = params;
            }
        }
    
        // 调用装饰器
        @logClass('XXX')
        class HttpClient {
            // 注意:装饰器的后面不需要加上分号
            @logProperty('HHHHHHH')
            public apiUrl: string | undefined;
            constructor() {
    
            }
            getData() {
                console.log(this.apiUrl);
            }
        }
        // 查看当前类的实例
        var http: any = new HttpClient();
        http.getData(); // 打印输出 HHHHHHH 

  7. 方法装饰器
  8.     function logMethod(params: any) {
            console.log(params)
            return function (target: any, methodName: any, desc: any) {
                console.log(target); // 原型对象 HttpClient { getData: [Function] }
                console.log(methodName);    //成员名称 getData 
                console.log(desc);  //描述符 { value: [Function],writable: true,enumerable: true, configurable: true }
                // 修改装饰器的方法
                console.log(desc.value); //[Function]
                // 修改装饰器的方法  把装饰器方法里面传入的所有参数改为string类型
                // 保存当前的方法
                var oMethod = desc.value;
                desc.value = function (...args: any[]) {
                    args = args.map((value) => {
                        return String(value);
                    })
                    // 打印出所有的参数
                    console.log(args); // [ '123', 'XXX' ]
                    oMethod.apply(this, args); // 可以同时打印出getData方法里面的输出值,并且打印出传入的数据值
                }
            }
        }
        class HttpClient {
            // 注意:装饰器的后面不需要加上分号
            public apiUrl: string | undefined;
            constructor() {
    
            }
            @logMethod('方法装饰器')
            getData(...args: any[]) {
                console.log(args);
                console.log('我是getData里面的方法');
            }
        }
        // 查看当前类的实例
        var http: any = new HttpClient();
        http.getData(123, 'XXX')

  9. 方法参数装饰器
  10.  function logMethod(params: any) {
            return function (target: any, paramsName: any, paramsIndex: any) {
                console.log(params);    // 打印输出 uid
                console.log(target); // 原型对象 HttpClient { getData: [Function] }
                console.log(paramsName);    //方法名 ---  getData
                console.log(paramsIndex);   //索引 ---  0
                target.apiUrl = params;
            }
        }
        class HttpClient {
            public apiUrl: string | undefined;
            constructor() {
    
            }
            getData(@logMethod('uid') uid: any) {
                console.log(arguments);// [Arguments] { '0': 12333 }
                console.log('我是getData里面的方法');
            }
        }
        // 查看当前类的实例
        var http: any = new HttpClient();
        http.getData(12333);
        // 打印出apiUrl
        console.log(http.apiUrl);  // 打印输出 uid

  11. 装饰器执行顺序
  12.     // 类装饰器
        function logClass(params: string) {
            console.log('类装饰器执行')
            return function (target: any) {
                console.log(target);
                console.log(params);
            }
        }
        // 方法装饰器
        function loggerMethod(params: any) {
            console.log(params)
            return function (target: any, methodName: any, desc: any) {
                console.log(target); // 原型对象 HttpClient { getData: [Function] }
                console.log(methodName);    //成员名称 getData 
                console.log(desc);  //描述符 { value: [Function],writable: true,enumerable: true, configurable: true }
                // 修改装饰器的方法
                console.log(desc.value); //[Function]
                // 修改装饰器的方法  把装饰器方法里面传入的所有参数改为string类型
                // 保存当前的方法
                var oMethod = desc.value;
                desc.value = function (...args: any[]) {
                    args = args.map((value) => {
                        return String(value);
                    })
                    // 打印出所有的参数
                    console.log(args); // [ '123', 'XXX' ]
                    oMethod.apply(this, args); // 可以同时打印出getData方法里面的输出值,并且打印出传入的数据值
                }
            }
        }
    
        // 属性装饰器
        function logProperty(params: string) {
            console.log('属性装饰器执行')
            // target 类的原型对象
            return function (target: any, attr: any) {
                console.log(target);
                console.log(attr);
                // 属性装饰器里面的target就相当于类装饰器里面的target.prototype
                // 就是类的原型对象,就可以修改类原型对象上面的属性
                target[attr] = params;
            }
        }
        function logMethod(params: any) {
            console.log('方法参数装饰器执行')
            return function (target: any, paramsName: any, paramsIndex: any) {
                console.log(params);    // 打印输出 uid
                console.log(target); // 原型对象 HttpClient { getData: [Function] }
                console.log(paramsName);    //方法名 ---  getData
                console.log(paramsIndex);   //索引 ---  0
                target.apiUrl = params;
            }
        }
        // 调用装饰器
        @logClass('XXX')
        class HttpClient {
            // 注意:装饰器的后面不需要加上分号
            @logProperty('HHHHHHH')
            public apiUrl: string | undefined;
            constructor() {
    
            }
            @loggerMethod('方法装饰器执行')
            getData(@logMethod('uid') uid: any) {
                console.log(arguments);// [Arguments] { '0': 12333 }
                console.log('我是getData里面的方法');
            }
        }
        // 查看当前类的实例
        var http: any = new HttpClient();
        http.getData(666);  // 打印输出 HHHHHHH 

  13. 打印如下 属性装饰器  方法装饰器 方法参数装饰器 类装饰器
  14. 属性装饰器执行
    HttpClient { getData: [Function] }
    apiUrl
    方法装饰器执行
    方法参数装饰器执行
    uid
    HttpClient { getData: [Function], apiUrl: 'HHHHHHH' }
    getData
    0
    HttpClient { getData: [Function], apiUrl: 'uid' }
    getData
    { value: [Function],
      writable: true,
      enumerable: true,
      configurable: true }
    [Function]
    类装饰器执行
    [Function: HttpClient]
    XXX
    [ '666' ]
    [Arguments] { '0': '666' }
    我是getData里面的方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值