5分钟理解ts装饰器

类装饰器:
本质上是对类的构造进行包装(修改)。可以为同一个类定义多个装饰器,通过@decorator_name的形式写在类声明之前。
参数:类的构造函数作为其唯一的参数。

1. 参数装饰器,然后依次是方法装饰器,访问符装饰器,或属性装饰器应用到每个实例成员。
2. 参数装饰器应用到构造函数。
3. 类装饰器应用到类。

// 1.1 类装饰
// 类的构造函数作为其唯一的参数。
console.log('----class decorae----');
function classDecorate(constructor: Function) {
  console.log(arguments);
}

@classDecorate
class Hello {
  msg: string;
  constructor(message: string) {
    this.msg = message;
    console.log("Hello constructor:", message);
  }
  sayHello() {
      return "Hello, " + this.msg;
  }
}

方法装饰器表达式会在运行时当作函数被调用,传入下列3个参数:
1、target:对于静态成员来说是类的构造函数,对于实例成员是类的原型对象。
2、propertyKey:成员的名字。
3、descriptor:成员的属性描述符。

注意  如果代码输出目标版本小于ES5,属性描述符将会是undefined。

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

注意  如果代码输出目标版本小于ES5返回值会被忽略。

console.log('----function decorate----');

function functionDecoreate(type: string) {
  return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {
    console.log("type:----",type);
    console.log("target----",target);
    console.log("propertyKey----",propertyKey);
    console.log("descriptor----",descriptor);
  };
}
  
class Hello2 {
  msg: string;
  constructor(message: string) {
      this.msg = message;
  }

  @functionDecoreate(false, "MyStr")
  sayHello() {
      return "Hello, " + this.msg;
  }
}

var hello = new Hello2("hello");
console.log(hello.sayHello());

装饰 静态成员/实例成员 时的区别逻辑
在TypeScript类中:

实例成员是仅当类被实例化的时候才会被初始化的类成员;
静态成员是存在于类本身上(而非类的实例上)的类成员,静态成员需要用static关键字声明。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值