从一个小例子学习Typescript中的装饰器Decorator

在ECMAScript中,很早就存在关于装饰器Decorator的提案,但一直没有作为正式的特性发布到Javascript中。Typescript实现了其中的一种版本,供我们使用和学习。不过没关系,区别仅仅在于实现的细节,只要我们理解了装饰器的目的和作用,即使有了新版本的规范,我们也能从容面对。


装饰器是用来更改Class的行为,通过装饰器,我们可以改变某个类的属性、方法、构造函数的参数等等。而装饰器的本质就是一个函数,我们在使用时,会把类及其属性传给该函数,然后在函数内部更改传入的类或类的方法,即可实现我们的目的。


以常见的函数节流功能为例,可以编写一个节流装饰器工厂函数:

function throttle(timeout: number) {
  return function (target: any, propertyName: string, descriptor: any) {
    const originalValue = descriptor.value;
    let enable = true;
    return {
      ...descriptor,
      value: function(...args: any[]) {
        if (!enable) { return; }
        enable = false;
        originalValue(args);
        setTimeout(() => {
          enable = true;
        }, timeout);
      }
    };
  };
}

在上述工厂函数中,我们接收一个参数,来确定节流的时间间隔。然后我们在工厂函数中返回一个函数,该函数就是实际的装饰器函数。

装饰器函数接收三个参数:

然后我们在装饰器函数中返回了一个描述符对象,重写了我们将要更改的方法的描述符。我们把描述符的value替换成了我们新写的具有节流功能的函数。

然后就可以使用这个修饰符了。

class B {
  constructor() {}
  @throttle(1100)
  alert(string: string) {
    console.log(new Date().getUTCSeconds());
    console.log(string);
  }
}
let ab = new B();
setInterval(() => {
  ab.alert('报警');
}, 400);

我们会发现,即使我们设置了每隔400ms打印一次信息,实际上是每隔1100ms才会打印一次。

上述例子可以从这里运行:https://www.typescriptlang.org/play

展开阅读全文

页面更新:2024-05-16

标签:法名   目的   原型   提案   美文   间隔   静态   函数   从容   实例   属性   例子   工厂   作用   参数   功能   方法

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top