答案 0 :(得分:1)
这实际上是documentation
中描述的官方方式function SomeClass(greeter) {
this.greeter = greeter;
}
SomeClass.prototype.doSomething = function(name) {
this.greeter.greet(name);
}
但我会考虑使用ES2015类语法。
export default class SomeClass {
constructor(greeter) {
this._greeter = greeter;
}
doSomething() {
this._greeter.greet(name);
}
}
您可以阅读更多here
答案 1 :(得分:1)
我所知道的最短时间是避免在外部范围内使用原型而只是使用闭包:
function SomeSrvc($http, ...other deps...) {
var srvc = this;
srvc.doSomething = function() {
// just use $http without this / srvc
};
}
简短又好看。如果你真的喜欢类似原型的语法,只需调整缩进(但在我看来这会更加丑陋):
function SomeSrvc($http, ...other deps...) {
var srvc = this;
srvc.doSomething = function() {
// Do stuff with srvc.$http and other srvc.deps...
};
}
这会产生相同的效果 - 使用new
运算符创建的对象将具有此功能,并且以这种方式创建角度服务。
此外,这种方式具有非常好的副作用。它不会在服务对象上创建变量,因此可以将它们视为private
,将所有变量分配给服务使它们public
并且可以从另一个角度模块访问它们。目前只需注入您的服务,您就可以通过调用例如
SomeSrvc.$http
这完全违背了依赖注入的整个想法。
答案 2 :(得分:0)
服务,而不是控制器,我一直在做一些不同的事情
module.factory('myService', function(dep1, dep2){
var createInternal=function(){
var internal = Object.create(proto);
internal.init( ... );
return internal;
};
var service = function(){
var internal = createInternal();
return {
doSomething: function(a, b, c){ return internal.doSomething(a,b,c); },
...
};
};
var proto = {
init: function( ... ){
dep1.greet();
dep2.doSomethingElse();
...
},
doSomething: function(a, b, c){
dep1.grito(b);
dep2.haceOtraCosa();
},
...
};
return service();
});
它有点不同,但它将其分解为标题和原型函数列表,我喜欢它。