#javascript #angularjs
#javascript #angularjs
Вопрос:
Я просто изучаю 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());
Теперь я изо всех сил пытаюсь найти лучший способ добиться наилучшего шаблона в angular. Что я сейчас делаю, так это:
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");
}]);
Это лучший способ сделать это? Является ли идея наличия функции внутри функции чем-то вроде антипаттерна?
Спасибо
Комментарии:
1. Что ж.. Я полагаю, это зависит. Фабрика — это фабрика, класс javascript — это класс javascript. Ничто не мешает вам использовать класс javascript в Angular… Это зависит от того, что вы пытаетесь сделать.
2. Какова функция
MyClass
? Кто его использует?
Ответ №1:
Фабрика предоставляет вам возвращаемое значение функции, которая была определена ben. Поэтому вместо возврата вашего конструктора вы могли бы просто сделать это:
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;
};
});
Таким образом, у меня есть единый сервис, который аккуратно объединяет все нужные мне мусорные баки, оставаясь при этом единственным местом, которое должно знать о реальном классе.