1

根据角度 js文档

服务(名称,构造函数);name : name constructor : 将被实例化的可注入类(构造函数)。

Internally :
{
  $get: function() {
    return $injector.instantiate(constructor);
  }
}

从角度文档可以得出结论,服务将第二个参数作为构造函数传递,提供者通过 $injector 创建实例并通过 $get 返回。因此,每当我们将服务注入到我们的任何模块函数(控制器、指令等)中时,它都应该返回新创建的对象,即 Singleton offcourse。

现在问题来了,如果我像这样定义我的服务。

1. _app_user_content.service("MyService" , function(){
        this.Message = "Greetings!";
    });  //returns object when injected.
2. _app_user_content.service("MyService" , function(){
        this.Message = "Greetings!";
        return "123"
    }); // returns object  when injected.
3. _app_user_content.service("MyService" , function(){
        this.Message = "Greetings!";
        return function(){}
    }); //returns function(){}  when injected. Doesnot return object

为什么第三种情况会返回一个函数?

4

1 回答 1

2

这是一个 JavaScript 的东西,而不是一个 Angular 的东西。

Angularservice所做的基本上是将您的函数用作构造函数new SomeObject()SomeObject作为您在第二个参数中定义的函数(重要的是要注意在 JavaScript 中函数是对象)。

如果您的函数不返回任何内容或原始值,则构造函数将忽略您的返回值,而是返回您在该函数的范围 (this) 上设置的任何内容。但是,如果您返回一个对象,那么构造函数似乎将返回该对象。(感谢@ajaykumar)

在浏览器控制台中试试这个...

function potato() {this.yummy = true; return function() {};} 
function tomato() {this.yummy = true;}
console.log(new potato());
console.log(new tomato());

你应该看到土豆回来了function () {}

你应该看到番茄回来了{yummy: true}

对于这样的构造函数,我建议什么都不返回。

但是,如果您要使用 angular 的工厂方法,您会发现不是new SomeObject()angular 会做return SomeObject(),在这种情况下,您想要返回一个对象,其中包含您想要在服务中公开的任何函数/参数。

new有关 JavaScript关键字、原型和构造函数的更多信息,请点击此处

于 2016-05-31T10:14:42.817 回答