TS装饰器

/*

装饰器:装饰器是一种特殊类型的声明,它能够被附加到类声明,方法,属性或参数上,可以修改类的行为。

    通俗的讲装饰器就是一个方法,可以注入到类,方法,属性参数上来扩展类,属性,方法,参数的功能。

    常见的装饰器有:类装饰器,属性装饰器,方法装饰器,参数装饰器。

    装饰器的写法:普通装饰器(无法传参) 装饰器工厂(可传参)

*/ 

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

// 属性装饰器

function  logProto(params:string) {

    return function (target:any,attr:string) {

            console.log('属性装饰器',target)

            console.log('属性装饰器',attr)

            target[attr]=params;

    }

}



class ProtoClass{

    @logProto('www.zsq.com')

    public apiUrl:string | undefined;

    constructor(){



    }

    getData(){

        console.log(this.apiUrl)

    }

}

var d=new ProtoClass();

d.getData()



// 方法装饰器

function logMethod(params:string){

    return function(target:any,method:any,des:any){

        console.log(target)

        console.log(method)

        target.apiUrl=params

        console.log(des)

        console.log('当前的方法', des.value)

        const oMethod=des.value;

        des.value=function(...args:any[]){

            args.map(item=>{

                return String(item)

            })

            console.log(args)

            // 方法中的参数,都转为字符串

            oMethod.apply(this,args)

        }

        target.run=function(){

            console.log('添加的run方法')

        }

    }

}



class MethodFn{

    @logMethod('自定义的apiUrl属性')

    getData(...args:any[]){

        console.log('修改后的方法接收参数',args)

    }

}

var m:any=new MethodFn();

console.log('自定义添加属性方法',m.apiUrl)

m.getData(123,'abc')

/*

    方法参数装饰器

    参数装饰器 表达式会在运行时当做函数被调用,可以使用参数装饰器为类的原型增加一些元素数据,传入下列3个参数

    1. 对于静态成员来说是类的构造函数,对于实例成员是类的原型对象。

    2.方法的名字。

    3.参数在函数参数列表中的索引

*/

console.log('--------------------------')

function  logParams(params:any) {

        return function (target:any,methodName:any,paramsIndex:any) {

            console.log(params)

            console.log(target)

            console.log(methodName)

            console.log(paramsIndex)

        }

}

class FPClass{

    getData(@logParams('canshu') uuid:any){

        console.log(uuid)

    }

}



var fp=new FPClass();

fp.getData(1234)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值