我正在学习Angular,并且正在努力找出实例化对象的最佳方法。
在我的旧式javascript中,我会做这样的事情:
var MyClass = function(){
var greeting;
this.init = function(my_greeting){
greeting = my_greeting;
}
this.get_greeting = function(){
return greeting;
}
};
var instance = new MyClass();
instance.init("hello");
console.log(instance.get_greeting());
现在我正在努力寻找获得角度最佳模式的最佳方法。我现在正在做的是:
my_app.factory("MyClass", function(){
return function(){
var greeting;
this.init = function(my_greeting){
greeting = my_greeting;
}
this.get_greeting = function(){
return greeting;
}
}
});
my_app.service("MyService", ["MyClass", function(MyClass){
var instance = new MyClass();
instance.init("hello");
}]);
这是解决这个问题的最好方法吗?想要在函数中使用函数有点反模式吗?
感谢
答案 0 :(得分:0)
工厂为您提供已定义的函数的返回值。因此,您可以简单地执行此操作,而不是返回构造函数:
my_app.factory("MyClass", function(){
return {
greeting: '',
init: function(){
// ...
},
// ...
}
});
因此,您将获得一个类的实例,以便在任何您喜欢的地方注入。我认为这是最常见的用法,因为您很少需要myClass
但是,如果您因某种原因需要多个实例,那么您的方法恰到好处。就个人而言,当我需要获取多个实例时,我喜欢这样做:
my_app.factory("superService", function(){
function MyClass(){
}
MyClass.prototype.foo = function(){
//...
};
return {
getInstance: function(){
return new MyClass();
}
}
});
或者以类似的方式。但正如@Patrick在评论中指出的那样,它在很大程度上取决于你想要实现的目标,并且没有什么能阻止你将OO模式应用到你的Angular应用程序中。
例如,我使用一个必须配置一组键值对的提供程序,然后为每个这样的键创建一个类Trash
的实例,并为我提供一个返回每个实例的服务:
trashModule.provider('Trash',function(){
var module = this;
this.config = {};
this.$get = function(trashInstance){
var entities = {};
for(var item in module.config){
entities[item] = trashInstance.get((module.config[item]));
}
return entities;
};
});
这样,我有一个服务,整齐地把我需要的所有垃圾箱放在一起,同时也是唯一一个必须了解实际课程的地方。