【问题标题】:Static Methods and Angular 2 Services in JavaScript ES6JavaScript ES6 中的静态方法和 Angular 2 服务
【发布时间】:2017-01-25 20:29:30
【问题描述】:

在使用 Angular 2 和多种计算服务编写应用程序时,我遇到了以下问题:

  1. 何时在应用程序级别提供的 Angular 服务中使用静态?这是废话吗?
  2. 静态方法如何反映性能?假设有几百个对象同时调用相同的静态方法。此方法是否多次实例化?

这是一个类的快照,它为我提供了多种计算方法并在应用程序级别实例化:

@Injectable()
export class FairnessService {
  constructor(){}
  private static calculateProcentValue(value: number, from: number): number {
    return (Math.abs(value) / Math.abs(from)) * 100;
  }
  public static calculateAllocationWorth(allocation: Allocation): number {
    ...
  }
}

感谢您的帮助。

【问题讨论】:

  • 私有静态? :o

标签: javascript angular typescript angular2-services


【解决方案1】:
  1. 类的静态方法,与实例方法不同,属于(可见于)类本身(不是它的实例)。它们不依赖于类的实例成员,通常会从参数中获取输入,对其执行操作并返回一些结果。他们独立行动。

它们在 Angular 服务中确实有意义。在某些情况下,我们不能/实际上不需要使用服务的实例,并且我们不能/不想对它建立新的依赖关系,我们只需要访问我们的服务所承载的方法. static 成员进来了。

使用服务中定义的静态方法的例子:

import { FairnessService } from './fairness.service';

export class MyComponent {

    constructor() {
        // This is just an example of accessing the static members of a class.
        // Note we didn't inject the service, nor manually instantiate it like: let a = new A();
        let value = FairnessService.calculatePercentValue(5, 50);
        let value2 = FairnessService.calculatePercentValue(2, 80);

        console.log(value); // => 10
        console.log(value2); // => 2.5
    }
}
  1. 静态 方法对性能没有影响。正如我们在上面所确定的,它们不依赖于类的任何实例,并且调用这些方法绝不会实例化该类。

欲了解更多信息,请参阅:http://www.typescriptlang.org/docs/handbook/classes.html

【讨论】:

  • 据我了解,当添加到模块的提供程序列表或添加到“providedIn”:根时,每个实例的至少一个实例在 Angular 中创建。我仍然很难理解单例服务中的静态方法或实例方法之间的区别。我实际上也没有看到任何非单例服务的用例,但我猜这是另一回事......如果你有的话,你能提供任何额外的信息吗?
  • 这确实有点违背了拥有依赖注入容器的理论目的,这将允许您在运行时将FairnessService 换成其他NotSoFairService,而无需更改FairnessService 实现。
【解决方案2】:

更新

我之前的回答是基于有限的理解。静态方法在一个类本身上可用,而不是在它的一个实例上。

这里有一篇文章可以解释这个概念: https://javascript.info/static-properties-methods

seidme 的回答也很中肯。

原创

静态方法在 Angular 应用程序中被表示为全局变量(我认为?),所以我认为它们每个只会被实例化一次。因此我认为它不会对性能产生很大影响(相对于需要它的每个组件的类的实例化。)

当我不想注入服务并获取实例只是为了利用与上下文无关的格式化/实用方法时,我使用静态。这些应用程序范围的版本对我来说似乎并不合理。

【讨论】:

  • 如果是这样的话那就太神奇了,我一直认为你必须注入服务才能使用它们:o
  • 我相信“注入”是针对DI流程的,所以如果你需要一个服务的实例,那么它必须被注入。但是,如果它是静态类(即没有实例!),则不需要实例,因此不需要 DI,因此不需要 @Injectable :)
  • 但是如何创建静态类呢?他的例子不是静态类吧?
  • @user2528534 无论哪种方式都没有任何好处。有益的是在适当的时候使用静态/普通函数,而不是试图将所有东西都强加到类实例中——Angular 的人有点特别..
  • class YourComponent { const localVar = StaticService.property } // localVar 可在视图中访问
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 2015-10-08
  • 2017-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多