可互换地使用角度工厂和服务 - 没有错误

时间:2015-02-16 15:59:16

标签: javascript angularjs angularjs-service

我正在使用service,其中应该有factory而且我没有收到错误。 我的服务在返回构造函数时返回并返回对象。
但我的代码完美无缺。

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

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>*/
   }
}

我的问题是为什么角度允许您在实际返回对象时使用.service并且应该使用.factory

2 个答案:

答案 0 :(得分:4)

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

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

厂:

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

服务:

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

正如我们所看到的那样,工厂实际上正在为我们提供工厂函数返回的对象。

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

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

这是棘手的部分,它正在工作,因为正如在使用服务之前所说的实际实例化一个对象,在我们的不良实践中,我们用新的构造函数覆盖默认构造函数。

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

也许这不是最佳做法,但有可能。 我认为我们最好继续按照惯例继续使用服务。

有趣的文章factory vs service vs provider

答案 1 :(得分:3)

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

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