在AngularJS中定义服务和工厂的正确方法

时间:2014-07-07 10:33:21

标签: javascript angularjs

我阅读了AngularJS的一些教程并注意到,每个人都在使用一种稍微不同的方法来定义服务。我想知道什么是最好的方法,或者在使用特定方法时会出现什么缺点。

我注意到的第一个区别是使用匿名函数还是命名函数:

angular.module('myApp').service('myService', function myService() {
  var _var1 = "foo";
  var public_methods = {
    doSomething: function() {
      return "bar";
    },
    var1: _var1
  };
  return public_methods;
});

angular.module('myApp').service('myService', function() {
  var _var1 = "foo";
  var public_methods = {
    doSomething: function() {
      return "bar";
    },
    var1: _var1
  };
  return public_methods;
});
  1. 这两种方法有什么不同吗?
  2. angular是否提供myService命名函数?怎么样?

  3. 第二个区别是定义“公共方法”,例如外面可见的东西:

    angular.module('myApp').service('myService', function myService() {
      var _var1 = "foo";
      var public_methods = {
        doSomething: function() {
          return "bar";
        },
        var1: _var1
      };
      return public_methods;
    });
    
    angular.module('myApp').service('myService', function myService() {
      var _var1 = "foo";
      this.doSomething = function() {
        return "bar";
      };
      this.var1 = _var1
    });
    

    第一个返回一个对象,该对象充当接口并定义公众可见的内容。第二个,用this定义其方法和属性。

    1. 有任何缺点吗?
    2. 为什么我更喜欢一种方法呢?

    3. 第三个区别是定义这样的服务:

      var Session = function() {};
      Session.prototype.doSomething = function() {
        return "bar";
      };
      Session.prototype.var1 = "foo";
      angular.module('myApp').service('myService', Session);
      

      在这里,我只看到一个缺点,即私有变量无法与其他功能共享。但这种方法有什么大的优势吗?我可以想象,对于工厂(而不是服务),性能会更好,因为原型函数只需要定义一次,而不是每次创建一个新对象(因为服务是单例,而不是工厂)。


      定义和使用工厂:我也不确定,如果使用工厂时最好采用以下方法:

      angular.module('myApp').factory('User', function() {
        var User = function(data) {
          angular.extend(this, {
            id: null,
            email: null,
            name: null
          }, data);
        };
        return User;
      });
      

      使用工厂时,我正在写new User(data)data与某些默认变量等合并。您如何看待这种方法?有一个很大的缺点吗?或者我是以错误的方式使用工厂?

1 个答案:

答案 0 :(得分:1)

我认为,基本上你提出的大部分内容 - 以及你以不同方式看待它的原因 - 是这些风格差异都是完全合法的JavaScript。这里没有真正的最佳实践。

第一个问题 - 没有区别。

第二个问题 - 两个都有效,我对第一个有强烈的个人偏好,因为它更灵活;你可以用这种方式做一些漂亮的技巧,对象操作类的东西。你可以做所有这些操作"这个"但我觉得没必要。再次,个人偏好。

第三个问题 - 这只是支持first class functions的JavaScript功能。它只是一种语言功能,它将归结为您喜欢设计的方式。我内联它们但将每个服务保存在自己的文件中。我认为你看到人们这样做是因为Angular Documentation on Services显示他们这样做,因为它更容易在文档中阅读。但它确实没那么不同。

我对您使用该工厂的方式没有疑问,但请确保您并不真正想要$ resource。