在javascript/angular中扩展对象

在javascript/angular中扩展对象,javascript,angularjs,Javascript,Angularjs,因此,我的angular应用程序中有一个tree helper对象,它提供了一系列有用的函数,用于处理应用程序中的许多树结构。这是由工厂提供的,因此每当某个控制器(或任何东西)请求树助手时,它都会得到自己的副本: angular.module('MainApp').factory('TreeHelperFactory', function ($http, $q, $filter, DataService) { var treeHelper = new function ($http,

因此,我的angular应用程序中有一个tree helper对象,它提供了一系列有用的函数,用于处理应用程序中的许多树结构。这是由工厂提供的,因此每当某个控制器(或任何东西)请求树助手时,它都会得到自己的副本:

angular.module('MainApp').factory('TreeHelperFactory', 
function ($http, $q, $filter, DataService) {
    var treeHelper = new function ($http, $q, $filter, DataService) {
    ...
    code
    ...
})
现在我有了一个category服务,它提供了各种与类别相关的功能,包括返回一个类别树并提供操作该树的方法。因此,像一个OO开发人员一样,我认为category服务实际上就像我的tree helper的一个子类,因此我插入了一个tree helper实例,然后尝试使用特定于类别的函数扩展该实例,天真地如下所示:

angular.module('MainApp').provider('CategoryService',
function() {
    this.$get = function ($http, $q, $filter, DataService, TreeHelperFactory) {
        var catService = TreeHelperFactory; 
        catService.listCategories = function() {...}
        catService.deleteCategory = function(id) {...}
        ... more code...
        return catService;
        }  
    }
);

但这不起作用。当我稍后尝试调用这些新属性时,它们不可见,只有原始factory对象的树帮助器属性。我遗漏了什么?我该如何做到这一点?

依赖Angular services的Helper对我来说是一个坏消息-几乎就像它的状态不仅仅是一个Helper,它还包含一两个service。您是否能够通过重组其角色和职责来重新考虑这一点?

angular.js中的服务是单例的,这意味着每次注入服务时,它都返回完全相同的对象,您无法强制它每次注入时都返回新对象

您可以做的是创建一个
函数,例如:

angular.module('MainApp')

.factory('TreeHelperFactory', 
function ($http, $q, $filter, DataService) {

    /**
     * TreeHelper constructor
     * @class    
     */
    function TreeHelper() { /* this.init(); */ }

    /**
     * TreeHelper static class method
     */
    TreeHelper.list = function() { /* ... */ };

    /**
     * TreeHelper instance method
     */
    TreeHelper.prototype.init = function() { /*...*/ };

    /**
     * Returns the class
     */
    return TreeHelper;
})
现在您可以注入它,实例化一个对象并像这样扩展它:

.factory('CategoryService', function (TreeHelperFactory) {

  var catService = new TreeHelperFactory();

  catService.listCategories = function() { /*...*/ };
  catService.deleteCategory = function(id) { /*...*/ };

  return catService;
});


您也可以使用,但我认为在大多数情况下这是一种过度使用,因此如果可以的话,请保持简单。

谢谢-我知道服务是单例的,但阅读有关工厂的文档时,我不太确定它们返回的状态。我将尝试上面的方法,看看这是否有效。“Helper”是我能想到的最好的词,但我真正的意思是提供特定功能的可注入对象,它不是单例对象,因为我需要它来存储数据。基本上是一个可以扩展的类。