什么是"装饰者"以及它们是如何使用的?

Kev*_*eal 147 javascript decorator angularjs angularjs-decorator

我很好奇AngularJS中究竟是什么装饰者.除了AngularJS文档中的模糊以及YouTube视频中的简短(虽然有趣)之外,在线提供的信息并不多.

正如Angular家伙所说的那样,装饰者是:

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

我真的不知道这意味着什么,我不确定为什么要将这个逻辑与服务本身分开.例如,如果我想在不同条件下返回不同的东西,我会将不同的参数传递给相关函数或使用另一个共享该私有状态的函数.

我仍然是一个AngularJS菜鸟,所以我确定这只是我所捡到的无知和/或坏习惯.

tam*_*are 217

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

  • 工厂,服务等是单身人士(因为他们提供),所以一旦装饰,总是装饰. (17认同)
  • @JonJaques - 无法抑制我的好奇心,所以我在原始示例中添加了几行来找到问题的答案,[link](http://plnkr.co/edit/KrE93Efay4B8leCATVrh?p=preview).简而言之,我之前评论中的猜测是正确的. (6认同)
  • 很棒的例子.我实际上想知道如何扩展第三方模块功能而不干涉它们 (5认同)
  • 装饰器实际上是鸭子类型服务的所有实例,还是它们只限于装饰它们的模块?换句话说,假设我有模块A来装饰来自模块B的服务.然后我有模块C,它依赖于模块A和模块B.在模块C的内部,模块B的服务是原始的还是装饰的版本? (5认同)
  • @JonJaques - 这是一个很好的问题.我没有遇到过这样的情况.如果我猜测,模块C看到的服务版本应该是模块A中的装饰版本,但我不能肯定地说,直到我自己尝试.你为什么不写一个简单的plunkr/jsffidle并试验一下.如果您能与我们分享您的发现,那将是非常棒的.干杯. (3认同)

JBl*_*and 66

装饰器使我们能够分离出跨领域的问题,并允许服务保留单一责任原则,而不必担心"基础设施"代码.

装饰的实际用途:

  • 缓存:如果我们有一个服务,这使得潜在的昂贵HTTP调用,我们可以在一个缓存装饰这使得外部调用之前检查本地存储包裹服务.
  • 调试/跟踪:根据您的开发/生产配置进行切换,通过调试或跟踪包装器来装饰您的服务.
  • 限制:在去抖动包装器中包装频繁触发的调用.例如,允许我们轻松地与速率受限的服务进行交互.

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


Dai*_*wei 10

decorator可以拦截由其创建的服务实例factory, service, value, provider,并提供更改一些instance(service)不可配置/选项的选项.

例如,它还可以提供用于测试目的的模拟实例$http.