交替使用 angular 工厂和服务 - 没有错误

Using angular factories and services interchangeably - no error

我在应该有 factory 的地方使用 service,但我没有收到错误。 我的服务 return 和对象应该 return 一个构造函数。
但我的代码运行完美。

例如,下面的代码应该不起作用。但它工作正常:

angular.module('myApp', [])
    .service('myService', myService);

function myService(/*<dependencies go in here>*/){
   return {
     /*<object attributes in here>*/
   }
}

正确的代码应该是这样的:

angular.module('myApp', [])
    .factory('myService', myService);

function myService(/*<dependencies go in here>*/){
   return {
     /*<object attributes in here>*/
   }
}

我的问题是为什么 angular 允许你使用 .service 而你实际上 return 一个对象并且应该使用 .factory

您服务中的显式 return 会覆盖默认的构造函数行为。

function factory () {

    return {
        foo: 'bar'
    };

}

console.log(factory().foo); // bar

function service () {

    this.foo = 'foo';

    return {
        foo: 'bar'
    };

}

console.log(new service().foo); // bar

Fiddle

好的,这是我对这个有趣问题的回答。

首先让我们确保我们了解服务和工厂之间的主要区别,在我们看到这两种实现之后会更容易:

工厂:

function factory(name, factoryFn) {
    return provider(name, { $get: factoryFn });
}

服务:

function service(name, constructor) {
    return factory(name, ['$injector', function($injector) {
        return $injector.instantiate(constructor);
    }]);
}

正如我们所看到的,工厂实际上正在做的是让我们获得工厂功能的对象 returns。

另一方面,服务使用我们提供的构造函数实例化一个新对象。不用说都是单身狗

在你上面的例子中,工厂的使用就像它应该的那样,这是最佳实践。 我想有趣的部分是为什么服务在工作,而他的构造函数并没有真正定义一个 class 但 returns 一个对象。

棘手的部分来了,它之所以有效,是因为如前所述,使用该服务实际上实例化了一个对象,在我们的不良做法中,我们用新的构造函数覆盖了默认构造函数。

听起来很混乱?这是一个 Fiddle 执行基本相同的事情,我们使用 new ConstructorFunc() 而 ConstructorFunc() 而不是定义一个对象并使用 this.prop 创建它的属性=something 正在返回一个对象。

也许这不是最佳做法,但它是可能的。 我认为我们最好像过去一样继续使用服务来遵循约定。

有趣的文章factory vs service vs provider