Javascript 创建可注入类(构造函数)

Javascript 创建可注入类(构造函数),javascript,angularjs,Javascript,Angularjs,我是一名AngularJS新手,我刚刚开始理解工厂、服务和控制器的概念和区别。据我所知,工厂用于返回可以注入的“值对象”。我见过的大多数例子都是这样的: angular.module('module.factories', function() { factory('FactoryObject', function() { return { someFunction: function(someParam) {}; some

我是一名AngularJS新手,我刚刚开始理解
工厂
服务
控制器
的概念和区别。据我所知,
工厂
用于返回可以注入的“值对象”。我见过的大多数例子都是这样的:

angular.module('module.factories', function() {
    factory('FactoryObject', function() {
        return {
            someFunction: function(someParam) {};
            someOtherFunction: function(someOtherParam) {});
        };
    });
});
在我的
控制器中
,我希望能够使用此对象,但我希望在控制器中初始化/实例化它,因为它可以根据控制器中的事件/操作重新初始化。因此,我想知道是否可以在工厂中返回构造函数

angular.module('module.factories', function() {
    factory('FactoryObject', function() {

        function FactoryObject(initParam) {
        }

        FactoryObject.prototype.someFunction = function() {};

        return FactoryObject;

    });
});

这是一个适合角工厂的模式吗?或者对这样的自定义对象使用工厂只是“矫枉过正”?我应该把它包含在一个库js文件中,然后从那里引用它吗?把它放在工厂里的一个好处是,在测试中很容易模拟它,因为它将在使用的地方注入。有没有其他可以替代的角度机构?

我也有同样的问题。以下是我实施的内容:

angular.module('foo', [])
.factory('Foo', ['$http', function($http) {
  return function(a, b) {
    this.arr = [];
    this.a = a;
    this.b = b;
    this.random = Math.floor(Math.random()*11);

    this.someFunc = function(c) {
      this.arr.push(c);
    };
  };
}]);
现在,我可以做:

var f1 = new Foo('A', 'B');
f1.random;  // i.e. 0
f1.someFunc('z');  // only affects f1.arr
var f2 = new Foo('C', 'D');
f2.random;  // i.e. 8
f2.someFunc('y');  // only affects f2.arr

使事情更加模块化。希望能有帮助。

我也有同样的问题。我发现了一篇关于如何设置面向对象AngularJS服务的精彩文章。请注意有关使用工厂而非服务的说明。它还包括扩展对象。我发现它非常容易设置,并且它与Angular完美匹配,同时保持Javascript简单明了


对于单例且不需要实例化的工厂服务,我使用对象文字方法,它具有一些性能优势。

你说得很对,这是创建可注入“类”(构造函数)的方法。但是,只有在需要注入类使用的其他内容时,才需要使用
factory

.factory('Class', ['$q', function ($q) {
    function Class () {}
    Class.prototype = {
        constructor: Class,
        doSomeAsyncAction: function () {
            return $q(function (resolve, reject) {
                // ...
            });
        },
        // ...
    };
    return Class;
})
如果您要创建一个完全独立的类(例如某些数据结构),则可以使用
常量
,这样即使在服务提供商中也可以使用您的类:

(function (undefined) {
    function Class () {}
    Class.prototype = { ... };
    angular.module(...)
        .constant('Class', Class);
})();


作为旁注,使用
提供程序
在这方面对您没有帮助。提供者服务于完全不同的目的,并且(除其他外)返回一个工厂函数,然后在第一次请求注入时使用该函数创建服务的单个实例。提供者用于让您在应用程序构建的_configphase uu()中配置单个服务实例。

以下是我解决问题的方法:

(function (myModule) {
    'use strict';

    myModule.service('myService', [
        function() {
            var serivce = this;
            var obj = null;

            service.func1 = function(a, b) {

            }

            service.func2 = function(c, d) {
                . . .
                return something;
            }

            var constructor = function(myObj) {
                obj = myObj;

                return service;
            }

            return constructor;
        }
    ]);
}(angular.module("myModule")))

(function(myModule) {
    'use strict';

    myModule.controller('myController', [
        '$scope', 'myService', function($scope, myService) {

            var service = myService($scope.someObj);

            $scope.someOtherObj = service.func2($scope.a, $scope.b);

        }
    ]);
}(angular.module("myModule")))

从服务返回的唯一内容是构造函数,然后服务返回服务的其余部分。

我认为在提供函数中声明自定义factory对象的关键在于它从应用程序的其余部分抽象出来。如果您确实需要构造函数,那你现在做的很好@ganaraj我之所以“需要”它,是因为它可能在控制器的生命周期内在控制器中多次重新初始化。我可以只返回一个常规对象,然后在其上有一个
init
方法,但我不认为这样会更好。感谢您的反馈。如果您正在寻找要重新初始化的相同对象,那么传递构造函数将不是一个解决方案。如果您希望能够创建多个类型的对象(构造函数),那么这将是正确的解决方案。@ganaraj不,我实际上在寻找新实例,所以我在控制器中使用
new FactoryObject(initParam)
。另一个例子是我本来可以解决它的。我们光荣地战斗。。。我现在将倒在我自己的剑上。