/*
装饰器:装饰器是一种特殊类型的声明,它能够被附加到类声明,方法,属性或参数上,可以修改类的行为。
通俗的讲装饰器就是一个方法,可以注入到类,方法,属性参数上来扩展类,属性,方法,参数的功能。
常见的装饰器有:类装饰器,属性装饰器,方法装饰器,参数装饰器。
装饰器的写法:普通装饰器(无法传参) 装饰器工厂(可传参)
*/
// 类装饰器:类装饰器在类声明之前被声明(紧靠着类声明)。类装饰器应用于类构造函数,可以用来监视,修改或替换类定义。
// 属性装饰器
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)
TS装饰器
最新推荐文章于 2024-07-30 17:09:59 发布