我阅读了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
与某些默认变量等合并。您如何看待这种方法?有一个很大的缺点吗?或者我是以错误的方式使用工厂?
答案 0 :(得分:1)
我认为,基本上你提出的大部分内容 - 以及你以不同方式看待它的原因 - 是这些风格差异都是完全合法的JavaScript。这里没有真正的最佳实践。
第一个问题 - 没有区别。
第二个问题 - 两个都有效,我对第一个有强烈的个人偏好,因为它更灵活;你可以用这种方式做一些漂亮的技巧,对象操作类的东西。你可以做所有这些操作"这个"但我觉得没必要。再次,个人偏好。
第三个问题 - 这只是支持first class functions的JavaScript功能。它只是一种语言功能,它将归结为您喜欢设计的方式。我内联它们但将每个服务保存在自己的文件中。我认为你看到人们这样做是因为Angular Documentation on Services显示他们这样做,因为它更容易在文档中阅读。但它确实没那么不同。
我对您使用该工厂的方式没有疑问,但请确保您并不真正想要$ resource。