Создание экземпляра объекта в AngularJS

#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;

};

});
 

Таким образом, у меня есть единый сервис, который аккуратно объединяет все нужные мне мусорные баки, оставаясь при этом единственным местом, которое должно знать о реальном классе.