AngularJS Factory可以返回两个不同的实例

时间:2016-02-19 18:04:14

标签: angularjs angularjs-factory

'use strict';
(function(){
    function myFactory(){
         var model = {};
         function viewModelManager(){
            return {
               getInstance : function(){
                   return model;
             }
         }
         return viewModelManager;
    }

}
 angular.module('main').factory('viewModelFactory',myFactory);
} ());

参考上面的代码片段,我想知道下面两个调用之间的区别:

    new viewModelFatory();

    viewModelFactory();

两者似乎都是返回viewModelManager函数返回的对象。那么使用operator new有什么好处呢?

对于上面的代码片段,我的理解也是正确的:
1)viewModelFatory只有一个实例,每当我们将它注入多个控制器时,它将引用该实例。
2)viewModelFactory可用于创建多个有状态实例,因为我在viewModelManager函数中创建了这些实例变量?
3)每当我调用new viewModelFatory()(或viewModelFactory())时,它会创建一个viewModelManager函数的新实例吗?

3 个答案:

答案 0 :(得分:0)

来自MDN

  

new运算符创建用户定义的对象类型或的实例   其中一个具有构造函数的内置对象类型。

使用public class EnemyAIController : MonoBehaviour { void OnTriggerEnter2D(Collider2D other) { Debug.Log("Reduce Player Health"); PlayerStatus.TakeDamage (1.0f); } } ,与new不同,您可以调用以下内容:

new()

所以你可以通过调用它们来返回不同的方法:

new factoryService.ConstructorFactory();

因此,在您的代码中,您将返回 var ConstructorA= function () { return 'A' }; var ConstructorB= function () { return 'B'; }; return { ConstructorA: ConstructorA, ConstructorB: ConstructorB }; 实例

答案 1 :(得分:0)

我假设代码应该是这样的:

'use strict';
(function(){
    function myFactory(){
         var model = {};
         function viewModelManager(){
            return {
               getInstance : function(){
                   return model;
             }
         }
         return viewModelManager;
    }
}
 angular.module('main').factory('viewModelFactory',myFactory);
} ());

记下return viewModelManager行的位置。

那就是说,如果我的假设是正确的,那么接下来会发生什么:

第一次' viewModelFactory'在另一个组件中找到注入的依赖项,angular将执行myFactory函数。 viewModelFactory等于myFactory函数的返回值,即viewModelManger。然后,如果你这样使用:

new viewModelFactory()

您将获得一个新的viewModelManger对象(原型viewModelManager)(即viewModelManager函数作为构造函数执行),此对象将不具有任何属性。

如果您使用的话是这样的:

viewModelFactory()

您将获得viewModelManager函数的返回值,该函数将具有原型Object和方法getInstance。

编辑: 嗯,没关系,我刚刚了解到,如果从构造函数中显式返回,那将覆盖默认的构造函数行为。

答案 2 :(得分:0)

  

AngularJS Factory可以返回两个不同的实例吗?

AngularJS提供商单身人士。使用new关键字不会创建新工厂。但是,工厂的方法可以创建新实例。

例如,工厂的getInstance方法可以创建新实例。

'use strict';
(function(){
    function myFactory(){
         var modelID = 0;
         function Model(id) {
             this.id = id;
         };
         function viewModelManager(){
            return {
               getInstance : function() {
                   return new Model(modelID++);
             }
         }
         return viewModelManager;
    }
}
 angular.module('main').factory('viewModelFactory',myFactory);
} ());

在上面的示例中,对viewModelFactory.getInstance()的第一次调用将返回Model对象的实例,id属性等于零。对viewModelFactory.getInstance()的下一次调用将返回一个id属性递增为1的实例。后续调用将创建具有类似递增的id属性的实例。

重申一下,AngularJS工厂是单身人士。但是,工厂方法可以创建不同的实例。