【typescript】TS编写和使用装饰器之(二):方法装饰器

关于ts的安装和使用请看上一篇:TS编写和使用装饰器之(一):类装饰器

方法装饰器声明在一个方法的声明之前(紧靠着方法声明)。 它会被应用到方法的 属性描述符上,可以用来监视,修改或者替换方法定义。 方法装饰器不能用在声明文件( .d.ts),重载或者任何外部上下文(比如declare的类)中。

方法装饰器表达式会在运行时当作函数被调用,传入下列3个参数:

1.对于静态成员来说是类的构造函数,对于实例成员是类的原型对象。
2.成员的名字。
3.成员的属性描述符。
注意  如果代码输出目标版本小于ES5,属性描述符将会是undefined

如果方法装饰器返回一个值,它会被用作方法的属性描述符。

下边看两个例子:

1.装饰器将传入方法的所有参数求和并精确到小数点指定位数:

function plusAllMoney(formatLength:number):Function{
    return function(target:any,propertyKey:string,descriptor:TypedPropertyDescriptor<Function>){
        const method = descriptor.value
        descriptor.value = function(){
            const total = Array.prototype.reduce.call(arguments,(t,c)=>{ return t+=c},0)
            return (method as Function).call(this,(total as number).toFixed(formatLength))
        }
    }
}

class ObjFn {
    constructor(){}

    @plusAllMoney(2)
    getMoney(...args:Array<number>){
        console.log("传入的金额之和为:"+args[0])
        return args[0]
    }
}



let man = new ObjFn()
man.getMoney(3,4,5)
man.getMoney(12,34)
man.getMoney(1,2,3,4,5)

编译并运行,在控制台可以看到输出:

>> 传入的金额之和为:12.00
>> 传入的金额之和为:46.00
>> 传入的金额之和为:15.00

2.对类的方法进行枚举隐藏:

function enumerable(value:boolean){
    return function(target:any,propertyKey:string,descriptor:PropertyDescriptor){
        descriptor.enumerable = value
    }
}

class ManFn {
    name = "jack"
    constructor(name?:string){
        if(name) this.name = name
    }

    @enumerable(false)
    sayHi(){
        console.log("Hello,My name is " + this.name)
    }

    run(){}
}



let man = new ManFn()
for(let k in man){
    console.log(k)
}

编译并运行,控制台输出:

>> name
>> run

在上边的例子中,我们把sayHi方法加了装饰器@enumerable(false),从enumerable装饰器函数中,我们看到有descriptor.enumerable = value,也就是说,这个装饰器把sayHi方法设置为了不可枚举。根目录运行tsc,然后运行生成的js文件,可以看到for循环输出了namerunsayHi没有输出,也就是装饰器的不可枚举生效了。
关于类型PropertyDescriptor,他内部有这么几个属性,跟Object.defineProperty一样:

interface PropertyDescriptor {
    configurable?: boolean;
    enumerable?: boolean;
    value?: any;
    writable?: boolean;
    get?(): any;
    set?(v: any): void;
}

除了枚举,还可以设置其他属性。

好了,关于方法装饰器就介绍到这里,后续会介绍其他的装饰器,欢迎关注。

上一篇:TS编写和使用装饰器之(一):类装饰器
下一篇:TS编写和使用装饰器之(三):访问器装饰器

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值