[英]Proper way for defining services and factories in 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;
});
myService
命名函数? 如何? 第二个区别是在定义“公共方法”,例如,外部可见的内容:
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
定义其方法和属性。
第三个区别在于定义这样的服务:
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
与一些默认变量等合并。您如何看待这种方法? 有很大的缺点吗? 还是我以错误的方式使用工厂?
我认为,您所要求的大部分内容以及您认为它做得不同的原因是,这些都是风格上的差异,完全是合法的JavaScript。 这里没有真正的最佳实践。
第一个问题-它没有区别。
第二个问题-都起作用,我对第一个问题有强烈的个人偏好,因为它更灵活; 您可以通过这种方法来实现一些漂亮的技巧,例如对象操作之类的东西。 您可能可以对它们全部进行“ this”操作,但对我而言,这是不必要的。 再次,个人喜好。
第三个问题-这只是JavaScript的一项功能,它支持一流的功能 。 这只是一种语言功能,将取决于您喜欢如何设计事物。 我内联它们,但将每个服务保留在自己的文件中。 我认为您看到人们这样做是因为有关服务的Angular文档显示了他们这样做的原因,因为它更易于阅读文档。 但这并没有太大的不同。
我对您如何使用该工厂没有问题,但是请确保您实际上并不需要$ resource。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.