在AngularJS中实例化一个对象

时间:2014-06-26 12:15:55

标签: 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());

现在我正在努力寻找获得角度最佳模式的最佳方法。我现在正在做的是:

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 个答案:

答案 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;

};

});

这样,我有一个服务,整齐地把我需要的所有垃圾箱放在一起,同时也是唯一一个必须了解实际课程的地方。