2016-02-19 61 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工廠是單身人士。但工廠方法可以創建不同的實例。

相關問題