交替使用 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
好的,这是我对这个有趣问题的回答。
首先让我们确保我们了解服务和工厂之间的主要区别,在我们看到这两种实现之后会更容易:
工厂:
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
的地方使用 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
好的,这是我对这个有趣问题的回答。
首先让我们确保我们了解服务和工厂之间的主要区别,在我们看到这两种实现之后会更容易:
工厂:
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 正在返回一个对象。
也许这不是最佳做法,但它是可能的。 我认为我们最好像过去一样继续使用服务来遵循约定。