2010-02-12 5 views
1

자바 스크립트에서 차이점은 무엇입니까?새 연산자를 사용하여 싱글 톤 자바 스크립트 객체를 초기화 하시겠습니까?

var singleton = function(){ ... } 

var singleton = new function(){ ... } 

?

crockford (http://www.crockford.com/javascript/private.html)에서 설명한대로 권한이 부여 된 함수를 선언하는 것은 후자를 사용하는 경우에만 작동합니다.

+0

내가 혼란 스러워요을 becau 질문의 본문이 제목에 나오는 내용과 일치하지 않습니다. 싱글 톤에서 새로운 것을 호출하면 어떤 일이 발생하는지 정말 알고 싶으니까 조금 불행합니다. 주로 다음과 같은 일을하면 어떻게 될까요? var singleton = new (function() {return function() {};})(); 새 함수가 반환 된 함수에 적용 되었습니까? – Bob

+0

우리는 '싱글 톤'으로 같은 것을 의미하지 않는다고 생각합니다. 질문에 대해서는 CMS의 아래 답변을보십시오. 새 연산자로 인해 함수가 자동으로 실행되고이 함수에서이 값은 새로 생성 된 객체를 나타냅니다. 아무 것도 반환하지 않으면 (또는 원시 함수가 아닌 값을 반환하지 않는다면),이 값은 리턴되어 싱글 톤 변수에 할당됩니다. " –

+0

싱글 톤은 객체의 단일 인스턴스이며 새 연산자가 필요하지 않습니다. 적어도 일부는 JavaScript를 참조 할 때 해당 용어를 사용합니다. 멋진 다른 정의를 보유하고 있다면. 코드 스 니펫에 관해서는 게시했습니다. 시도했지만 실패했습니다. 함수를 괄호로 묶고 appending()을 추가하면 함수를 실행하고 즉시 객체를 반환하므로 new는 객체에서 작동하지 않습니다. – Bob

답변

5

차이는 두 번째 예는 new 연산자 기능이 자동으로 실행되도록한다하는 Constructor로 함수식을 사용하고, 그 함수 내부 this 값은 새로 생성 된 객체를 참조 것을 주로 .

해당 함수에서 아무 것도 반환하지 않거나 비 프리미티브 값을 반환하지 않으면 this 값이 반환되어 singleton 변수에 할당됩니다.

권한 방법은 또한 당신의 두 번째 예제에서 사용할 수있는 공통의 패턴이 개인 멤버 액세스되는 closure을 만들어 immediately invoked function expression을 사용하는 것입니다, 당신은 당신 공개 API, 예를 들어있는 개체를 반환 할 수 있습니다 :

var singleton = (function() { 
    var privateVar = 1; 

    function privateMethod() {/*...*/} 

    return { // public API 
    publicMethod: function() { 
     // private members are available here 
    } 
    }; 
})(); 
+0

좋은 답변입니다! +1 –

+0

당신은 그것을 못 박았습니다 ... –

0

나는 크록 포드에 의해 설명 된 특권 기능은 다음과 같을 것이라고 생각 :

function Test() { 
    this.privileged = function() { 
      alert('apple'); 
    } 
    function anonymous() { 
     alert('hello'); 
    } 
    anonymous(); 
} 

t = new Test; // hello 
t.privileged(); // apple 

// unlike the anonymous function, the privileged function can be accessed and 
// modified after its declaration 

t.privileged = function() { 
    alert('orange'); 
} 

t.privileged(); // orange 
+1

그건 사실 특권이 있지만 단 하나는 아닙니다. –