在使用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 {
...
}
}
感谢您的帮助。
答案 0 :(得分:23)
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
}
}
2)静态方法对性能没有影响。正如我们上面已经确定的那样,它们不依赖于类的任何实例,并且调用这些方法绝不会实例化该类。
有关详情,请参阅:http://www.typescriptlang.org/docs/handbook/classes.html
答案 1 :(得分:2)
静态方法在Angular应用程序中表示为全局变量(我认为?),因此我认为它们只会在每次实例化时被实例化。因此,我认为它不会对性能产生很大影响(相对于需要它的每个组件的类实例化。)
当我不想注入服务并获取实例以利用与上下文无关的格式化/实用程序方法时,我使用静态。这些应用程序范围的版本对我来说似乎不合理。