2016-02-19 56 views
0
'use strict'; 
(function(){ 
    function myFactory(){ 
     var model = {}; 
     function viewModelManager(){ 
      return { 
       getInstance : function(){ 
        return model; 
      } 
     } 
     return viewModelManager; 
    } 

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

在参考上面的代码片段,我想知道以下两个调用之间的区别:AngularJS厂可返回两个不同的实例

new viewModelFatory(); 

viewModelFactory(); 

两个似乎是返回viewModelManager函数返回的对象。那么使用operator new的优点是什么?

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

回答

0

MDN

的新的运营商创建一个用户定义的对象类型的实例或之一的 内置在具有构造函数的对象类型。

随着new,不像new()你可以调用这样的事情:

new factoryService.ConstructorFactory(); 

所以,你可以称他们返回不同的方法:

var ConstructorA= function() { 
     return 'A' 
    }; 

    var ConstructorB= function() { 
     return 'B'; 
    }; 
    return { 
     ConstructorA: ConstructorA, 
     ConstructorB: ConstructorB 
    }; 

因此,在你的代码中被返回viewModelManager实例

+0

它不回答我的问题 –

+0

如果我在不使用它的情况下获得相同的结果,那么使用new运算符有什么优势? –

+0

我每次调用viewModelFatory()或new viewModelFatory()时都会返回viewModelManager实例,但它们将始终不同。它是否正确?如果是的话,我们应该使用什么,以及另一个优势是什么? –

0

我假设代码应该看起来像e此:

'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”被发现在另一种组分注入依赖,角将执行myFactory功能。 viewModelFactory等于myFactory函数的返回值,它是viewModelManger。然后,如果你使用这样的:

new viewModelFactory() 

你会得到一个新的viewModelManger对象(原型viewModelManager)(即viewModelManager功能作为构造函数执行),这个对象不会有任何性能。

而如果你用的是这样的:

viewModelFactory() 

,你会被给予viewModelManager功能,这将有原型对象和getInstance方法的返回值。

编辑: 嗯,从来没有,我刚刚得知,如果你明确从构造函数返回,那将覆盖默认的构造函数行为。

0

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

AngularJS Providers are singletons。使用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工厂是单身人士。但工厂方法可以创建不同的实例。

相关问题