2012-11-05 3 views
4

자바 스크립트에서 싱글 톤을 만드는 두 가지 방법에 대한 독서 과제가 있습니다. 간단한 변수 리터럴 방식과 개인 변수를 사용하려는 클로저 기법이 있습니다.클래스 - "생성자 함수"를 싱글 톤으로 변환하는 Javascript 유틸리티 함수

내가 예를 들어, 유틸리티 함수를 만들 찾고 무엇이든 클래스

Singleton(classname);

- 싱글 톤 방법은 싱글로이 클래스를 변환 "생성자 함수는"내가 여기에 인수로 전달 객체, 더하기 new Classname()을 호출 한 후 누군가 다시 새로운 classname()을 발생하면 new Error ("Already instantiated once, this is Singleton");

사용 사례는 다음과 같습니다 -

function Circle() {this.name = "Circle";} 
SingleTon(Circle); 
var circle1 = new Circle(); // returns the circle instance 
var circle2 = new Circle(); // throws Error "Already instantiated once, this is Singleton" 

여기서는 "싱글 톤"방법을 정의하려고합니다.

나는 getInstance 메소드는 같은 인스턴스를 가져 오는 데 사용됩니다 유사한 예를 보았다 -하지만 위의 특정 질문을 찾고 Singleton.getInstance (원) 등을 어디에서 인스턴스를 작성하는 습관 다른 프로그래머 "새로운"방법은 자신의 코드 어딘가에서 new Circle(); 두 번째 시도를 시도하고 오류를받습니다.

이런 식으로 싱글 톤을 만드는 것은 하나의 문제이지만 주된 문제는 Circle 생성자가 Singleton 함수의 어딘가에서 수정되어야 할 필요가 있다는 것을 이해하는 "Error"를 던지고있는 것입니다.

해결책이 있습니까?

미리 감사드립니다.

Singleton('Circle'); 

데모 :

답변

3
function Singleton(param){ 
    var count = 0, old = window[param]; 
    window[param] = function(){ 
     if(++count <= 1) return old; 
     else alert('NO WAY!'); 
    } 
} 

당신은 그것을 부를 것이다 Circle 또는 기타 기능 클래스가 글로벌 window 네임 스페이스에있는 경우 http://jsfiddle.net/maniator/7ZFmE/

이 단지 작품을 기억하십시오. 다른 네임 스페이스의 모든 항목이 제대로 작동하려면 더 많은 조작이 필요합니다.

+0

번개 빠른, 나는이 질문을 게시 한 후 첫 번째 코드는 초 내에 스 니펫을 한 다음 전화 및 2 분 주위를 데려 jsfiddle을 추가 계속 볼 수 있었다.이러한 신속 함의 정확성은 믿기지 않습니다. 그것은 다음과 같은 모든 요구 사항을 다룹니다. 이미 작성된 Circle 함수를 변경할 수 없습니다. Circle 함수는 Singleton 함수와 독립적이어야하며 Singleton 함수는 Circle 함수를 수정합니다. 이 솔루션은 사전 작성된 코드에 쉽게 적용 할 수 있습니다. 나는 다른 사람들이 이것에 대답하기를 기다리고 있었지만, 더 좋은 대답을 얻으려는 희망은 거의 없었다. –

+1

몇 초 안에 진짜 천재 답변 :) 고마워요 –

+0

@AnmolSaraf 문제 없어요^_^도와 드리겠습니다! – Neal

0

이 시도 :

Circle = function() { 
    if (!(this instanceof Circle)) { 
    // called as function 
    return Circle.singleton || (Circle.singleton = new Circle()); 
    } 
    // called as constructor 

    this.name = "the circle"; 
}; 

이제 new 연산자없이, 당신은 싱글 또는

var mycircle = Circle(); 

내가 예를 들어 전역 이름을 사용하고주의 사용하여 새로운 하나를 얻을, 당신은 할 수있다 do do

var Circle = window.Circle = function() { //... 
0

물론 s로 클로저를 사용할 수있는 단일 인스턴스 개체를 만들 수도 있습니다 같은 omething :

var singlecircle = (new function(name) { 
     this.name = name || "Default circle";}('squared') 
    ); 
singlecircle.name; //=> 'squared' 
관련 문제