2016-05-31 6 views
1

각 js 당 docs각도 Js 서비스가 함수/객체를 반환합니까?

서비스 (이름, 생성자); name : name 생성자 : 인스턴스화 될 주입 가능한 클래스 (생성자 함수)입니다.

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

이 얻을 $을 통해 $ 인젝터 및 반환을 통해 인스턴스 를 생성 서비스는 생성자와 제공자로 전달 된 2 인자를 처리하는 각 문서에서 결론을 내릴 수 있었다. 따라서 우리 모듈 함수 (컨트롤러, 지시어 등)에 서비스를 삽입 할 때마다 새로 생성 된 객체 인 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 

왜 세 번째 사례가 함수를 반환합니까?

답변

2

이것은 JavaScript적인 것으로, 각도 이상의 것입니다. 각도 service은 기본적으로 두 번째 인수에 정의 된 함수 인 new SomeObject(), SomeObject을 수행하여 생성자로 기능을 사용할 수 있습니다 무엇을

는 (중요한 자바 스크립트 함수에서 그 객체에 유의하십시오).

함수가 아무것도 반환하지 않거나 원시 값을 반환하면 생성자는 반환 값을 무시하고 대신 해당 함수의 범위 (this)에 설정 한 값을 반환합니다. 그러나 객체를 반환하면 생성자가 대신 객체를 반환합니다. (감사 @ajaykumar)

당신은 감자 반환 function() {}를 볼 수 ... 브라우저 콘솔에서

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

을이보십시오.

토마토 반환 {yummy: true}을 확인해야합니다.

이와 같은 생성자 함수의 경우 아무 것도 반환하지 않는 것이 좋습니다.

당신의 각도 factory 방법을 사용했다 그러나 그 대신 각 new SomeObject()을하고 당신은 당신이 당신의 서비스에 노출 할 모든 기능/매개 변수를 사용하여 객체를 반환 할 경우 return SomeObject()을 할 것을 발견됩니다.

JavaScript new 키워드, 프로토 타입 및 생성자 함수에 대한 자세한 정보 here.

+1

귀하의 답변은 javascript 구문의 기본을 올바르게 가리 킵니다. 더 자세히 조사해 보면 함수가 자바 스크립트 프리미티브를 반환하면 새로 만든 객체를 반환한다고 결론 내릴 수 있습니다. 그러나 return 문에 기본 유형 이외의 다른 유형이 포함되어 있으면 return 문을 지정하고 객체를 생성하지 않습니다. – ajaykumar