Angularjs服务单身人士吗?

在参考书中我读到:

最后,认识到所有的Angular服务都是应用单例是很重要的。 这意味着每个喷油器只有一个给定服务的实例。

但是这个简单的代码似乎不是一个单身人士

'use strict'; angular.module('animal', []) .factory('Animal',function(){ return function(vocalization){ return { vocalization:vocalization, vocalize : function () { console.log('vocalize: ' + this.vocalization); } } } }); angular.module('app', ['animal']) .factory('Dog', function (Animal) { return Animal('bark bark!'); }) .factory('Cat', function (Animal) { return Animal('meeeooooow'); }) .controller('MainCtrl',function($scope,Cat,Dog){ $scope.cat = Cat; $scope.dog = Dog; console.log($scope.cat); console.log($scope.dog); //$scope.cat = Cat; }); 

我有点困惑,你能解释我有什么事吗?

更新1可能是我不是在棚子最尖锐的工具,但后者@Khanh回复将是一个更好的解释在参考它不是很清楚。

更新2

 'use strict'; angular.module('animal', []) .factory('Animal',function(){ return { vocalization:'', vocalize : function () { console.log('vocalize: ' + this.vocalization); } } }); angular.module('dog', ['animal']) .factory('Dog', function (Animal) { Animal.vocalization = 'bark bark!'; Animal.color = 'red'; return Animal; }); angular.module('cat', ['animal']) .factory('Cat', function (Animal) { Animal.vocalization = 'meowwww'; Animal.color = 'white'; return Animal; }); angular.module('app', ['dog','cat']) .controller('MainCtrl',function($scope,Cat,Dog){ $scope.cat = Cat; $scope.dog = Dog; console.log($scope.cat); console.log($scope.dog); //$scope.cat = Cat; }); 

BOOM这是一个单身人士!

更新3

但是,如果你喜欢

 'use strict'; angular.module('animal', []) .factory('Animal',function(){ return function(vocalization){ return { vocalization:vocalization, vocalize : function () { console.log('vocalize: ' + this.vocalization); } } } }); angular.module('app', ['animal']) .factory('Dog', function (Animal) { function ngDog(){ this.prop = 'my prop 1'; this.myMethod = function(){ console.log('test 1'); } } return angular.extend(Animal('bark bark!'), new ngDog()); }) .factory('Cat', function (Animal) { function ngCat(){ this.prop = 'my prop 2'; this.myMethod = function(){ console.log('test 2'); } } return angular.extend(Animal('meooow'), new ngCat()); }) .controller('MainCtrl',function($scope,Cat,Dog){ $scope.cat = Cat; $scope.dog = Dog; console.log($scope.cat); console.log($scope.dog); //$scope.cat = Cat; }); 

有用

它是单身人士,只有一个对象,但被注入许多地方。 (对象通过引用传递给方法)

你所有的Animal都是对象指针,指向你的情况下的一个函数 。 你的Dog是由这个函数构造的对象。

是的,服务是单身。 以下代码只logging一个“M”到控制台:

 function M() { console.log('M'); } function M1(m) { console.log(1); } function M2(m) { console.log(2); } angular.module('app', []) .service('M', M) .service('M1', ['M', M1]) .service('M2', ['M', M2]) .controller('MainCtrl',function(M1, M2){}); 

在jsbin中运行它

让我举一个关于AngularJS中单例的例子。 假设我们在单页面应用程序的不同部分使用了2个控制器:

 myApp.controller('mainController', ['$scope', '$log', function($scope, $log) { $log.main = 'First Var'; $log.log($log); }]); 

所以现在如果我们去了通过mainController控制器控制的页面,我们会在日志中看到这个:

在这里输入图像说明

如你所见,日志对象现在包含我的第一个variables。

现在,这是我的第二个控制器:

 myApp.controller('secondController', ['$scope', '$log', '$routeParams', function($scope, $log, $routeParams) { $log.secondVar = 'Second Var'; $log.log($log); }]); 

所以如果你点击被控制的第二页,你会看到:

在这里输入图像说明

现在回到第一页:

在这里输入图像说明

你对这3个步骤有什么结论?

他们是一个注入到应用程序的$log对象。 正如Tony Alicea所说:这是一个很大的记忆保存。

所以这个服务被称为一次,每次我们将新的variables和参数添加到同一个对象,而不是为不同的参数添加不同的对象。

你的例子使用factory ,而不是service 。 请注意, provider也是游戏的一部分。

迄今为止最好的学习资源:

AngularJS:服务vs提供者vs工厂

MiškoHevery有一个启发性的解释和factoryserviceprovider的实际例子。 强烈推荐