什么是“装饰者”,他们是如何使用的?

我很好奇AngularJS中的装饰器究竟是什么。 除了AngularJS文档中的简介以及YouTubevideo中简短的(尽pipe有趣的)提及之外,没有太多关于装饰器的信息。

正如Angular的人所说,它是一个装饰者:

服务的装饰,允许装饰者拦截服务实例的创build。 返回的实例可以是原始实例,也可以是委托给原始实例的新实例。

我真的不知道这是什么意思 ,我不知道你为什么要把这个逻辑与服务本身分开。 例如,如果我想在不同的条件下返回不同的东西,我只是将不同的parameter passing给相关的函数,或者使用另一个共享该私有状态的函数。

我还是一个AngularJS noob,所以我敢肯定,这只是我已经拿起的无知和/或坏习惯。

$provide.decorator一个很好的用例是当你需要对你的模块所依赖的某些第三方/上游服务进行小小的“调整”,同时使服务保持完好(因为你不是服务器的所有者/维护者服务)。 这是一个关于plunkr的演示。

装饰者使我们能够分离出横切关注点,并允许服务保留SRP,而不必担心“基础结构”代码。

装饰者的实际用途:

  • caching:如果我们有一个服务,可能会造成HTTP调用潜在的昂贵,我们可以将服务包装在一个caching装饰器中,在进行外部调用之前检查本地存储器。
  • debugging/跟踪:根据您的开发/生产configuration使用debugging或跟踪包装来装饰您的服务。
  • 节stream:将经常触发的调用包装在去抖动包装中。 例如,允许我们轻松地与限速服务进行交互。

在所有这些情况下,我们将服务中的代码限制为其主要职责。

decorator可以拦截由factory, service, value, provider创build的服务实例,并给出选项来改变一些instance(service) ,否则这是不可configuration/带有选项的。

它也可以提供用于testing目的的模拟实例,例如$http

简而言之,我们可以说它就像一个扩展方法。 例如 我们有一个类,它有两个方法,运行时我们想添加更多的方法,然后我们使用装饰器。

我们不能使用带有常量的$ provide.decorator,因为我们不能改变它们正在堆只读属性的常量。