2016-05-31 143 views
1

按照角度js docsAngular Js服務返回函數/對象?

service(name,constructor); name:name 構造函數:將被實例化的注入類(構造函數)。

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

它可以從該服務將其視爲一個構造函數和供應商通過了 第二個參數的角度文檔可以得出結論,通過$噴油器並返回到$創建一個實例 得到。因此,無論何時我們將在我們的任何模塊功能(控制器,指令 等)中注入 服務,它都應返回新創建的對象,即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 

爲什麼第三個案例返回一個函數?

回答

2

這是一個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}

對於這樣的構造函數,我建議不要返回任何東西。

然而,如果你使用角度的factory方法,你會發現,而不是做new SomeObject()角會做return SomeObject(),在這種情況下,要與你想在你的服務來暴露任何功能/參數返回一個對象。

有關JavaScript new關鍵字,原型和構造函數here的更多信息。

+1

你的答案正確地指向javascript語法基礎。 進一步調查,我可以得出結論,如果該函數返回javascript原語它返回新創建的對象。但是,如果return語句包含基本類型以外的內容,它只是簡單地分配return語句而不創建對象。 – ajaykumar