gpt4 book ai didi

javascript - 在 javascript/Angular 中扩展对象

转载 作者:行者123 更新时间:2023-11-28 00:50:09 26 4
gpt4 key购买 nike

所以我的 Angular 应用程序中有一个树辅助对象,它提供了一堆有用的函数来处理应用程序中的许多树结构。这是由工厂提供的,因此每次某个 Controller (或其他)请求树助手时,它都会获得自己的副本:

angular.module('MainApp').factory('TreeHelperFactory', 
function ($http, $q, $filter, DataService) {
var treeHelper = new function ($http, $q, $filter, DataService) {
...
code
...
})

现在我有一个类别服务,它提供各种与类别相关的功能,包括返回类别树并提供操作该树的方法。因此,像 OO 开发人员一样思考,我认为类别服务实际上就像我的树助手的子类,因此我注入(inject)一个树助手实例,然后尝试使用特定于类别的函数扩展该实例,天真地像这样:

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;
}
}
);

但这行不通。当我稍后尝试调用新属性时,它们不可见,只能看到原始工厂对象的树辅助属性。我缺少什么以及如何实现这一目标?

最佳答案

Angular.js 中的服务是单例,这意味着每次注入(inject)服务时它都会返回完全相同的对象,您不能强制它每次注入(inject)时都返回一个新对象。

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

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;
})

现在您可以注入(inject)它,实例化一个对象并扩展它,如下所示:

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

var catService = new TreeHelperFactory();

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

return catService;
});
<小时/>

您还可以使用javascript prototypical inheritance但我认为对于大多数情况来说这有点过分了,所以如果可以的话请保持简单。

关于javascript - 在 javascript/Angular 中扩展对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26880405/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com