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

标签 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 命名函数?怎么办?
<小时/>

第二个区别是定义“公共(public)方法”,例如外部可见的内容:

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

第一个返回一个对象,它的作用类似于一个接口(interface),定义了公众可见的内容。第二个,使用 this 定义其方法和属性。

  1. 有什么缺点吗?
  2. 为什么我更喜欢其中一种方法而不是另一种?
<小时/>

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

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

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

<小时/>

定义和使用工厂:我也不确定以下方法是否是使用工厂时的最佳实践:

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 与一些默认变量等合并。您对此方法有何看法?有很大的缺点吗?或者我是否以错误的方式使用工厂?

最佳答案

我认为,总的来说,您所要求的大部分内容 - 以及您看到它以不同方式完成的原因 - 是这些都是完全合法的 JavaScript 的风格差异。这里没有真正的最佳实践。

第一个问题 - 没有什么区别。

第二个问题 - 都有效,我个人更倾向于第一个问题,因为它更灵活;您可以使用一些巧妙的技巧来做到这一点,例如对象操作之类的东西。你可能可以对“this”进行所有操作,但我觉得没有必要。再次强调个人喜好。

第三个问题 - 这只是 JavaScript 的一个功能,支持 first class functions 。这只是一种语言功能,最终取决于您喜欢如何设计事物。我内联它们,但将每个服务保存在自己的文件中。我认为你看到人们这样做是因为 Angular Documentation on Services展示他们这样做是因为这样更容易阅读文档。但实际上并没有太大不同。

我对你如何使用该工厂没有问题,但请确保你实际上并不需要 $resource。

关于javascript - 在 AngularJS 中定义服务和工厂的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24608556/

相关文章:

Javascript 表单计算返回 NaN 直到最后一个条目

javascript - 本地运行 Azure Functions 时无法附加调试器,遵循此

javascript - 网格面板中的动态单元格编辑器

javascript - AngularJs,过滤不区分大小写

angularjs - 用于 SEO 配置的 .htaccess 重定向

c# - 返回自定义错误 WebApi ASP.NET 5 HttpResponseException 错误状态码

javascript - 用于 Google 可视化图表的 x 轴标签的包装文本

javascript - 限制 Jekyll Search 中的搜索结果

arrays - <select> 可以通过 Angular.js 中的索引绑定(bind)到数组吗?

javascript - AngularJS 条件语法