根据角js 文档
服务(名称,构造函数);名称:名称构造函数:将被实例化的可注入类(构造函数)。
Internally :
{
$get: function() {
return $injector.instantiate(constructor);
}
}从角度文档可以得出这样的结论:服务将传递的第二个参数作为构造函数处理,提供者通过$injector创建实例并通过$get返回。因此,每当我们将服务注入到任何模块函数(控制器、指令等)中时,它都应该返回新创建的对象,即Singleton。
现在,如果我像这样定义我的服务,问题就出现了。
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为什么第三种情况返回函数?
发布于 2016-05-31 10:14:42
这是一个JavaScript的东西,不只是一个角度的东西。
角service所做的基本上是通过执行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}。
对于这样的构造函数,我建议不返回任何内容。
但是,如果要使用工厂方法,您将发现,不执行new SomeObject() return将执行return SomeObject(),在这种情况下,您希望返回一个具有您想要在服务中公开的任何函数/参数的对象。
关于JavaScript new关键字、原型和构造函数这里的更多信息。
https://stackoverflow.com/questions/37542634
复制相似问题