这是我在创建 AngularJS 应用程序时一直在考虑的问题。当我第一次了解 AngularJS 工厂时,我认为它们的一个巧妙用法是创建并返回构造函数而不是普通对象,例如:
app.factory("Foo", function() {
function Foo(bar, baz) {
this.bar = bar;
this.baz = baz;
...
}
Foo.prototype = {
constructor: Foo,
method1: function() { ... },
method2: function() { ... },
...,
methodn: function() { ... },
};
return Foo;
});
然后,您可以将该函数注入您的控制器并使用new
. 我发现这在美学上令人愉悦且面向对象,但现在我开始认为它实际上是一种反模式。问题是当你在支持 AngularJS 的上下文中工作时它工作得很好,但是一旦你想从控制台调用构造函数,在 Web Worker 中使用它,或者在非AngularJS 应用程序,您开始不得不围绕AngularJS 工作,而不是使用它。我开始怀疑这种方法是否被误导,因为 javascript 中的函数似乎已经是“单例”并且似乎不需要任何帮助来实例化。
我在滥用 AngularJS 工厂吗?我会更好地使用暴露于全局范围的构造函数吗?更一般地说,是否有特定因素促进 AngularJS 工厂/服务/提供者在全局对象上的使用,反之亦然?