2013-03-07 2 views
1

내가 가지고 일부 개인 변수를 사용하고 공공이 방법 노출 플러그인의 : new myWorld();생성자 함수의 인스턴스를 하나만 생성 하시겠습니까?

유일한 옵션 :

JSBIN 1

function myWorld() 
    { 
     var myPrivate=1; 
     this.do1=function(){alert(myPrivate);} ; 
    } 

var a=new myWorld(); 

a.do1() //1 
alert(a.myPrivate); //undefined (as it should be) 

는하지만 다시는 이런 일을 방지하려면 객체 리터럴을 알고 있습니다 :

JSBIN 2

var myWorld= 
    { 
     myPrivate:1, 
     do1:function(){alert(this.myPrivate);} 
    } 


alert(myWorld.myPrivate); //1 (ouch....) 
myWorld.do1() //1 

질문

어떻게 개인 필드를 캡슐화 할 수 및 >1 times을 인스턴스화하는 여전히 myWorld에서 사용을 방지? 이 라인을 따라

답변

2

클로저 범위를 정의 할 수있는 좋은 도구입니다 :

var myWorld= (function(){ 
    var myPrivate = 1; 
    return { 
     do1:function(){alert(myPrivate);} 
    } 
    }()); 


    myWorld.do1(); 

당신은 당신이 할 수있는 무료 Learning JavaScript Design Patterns

2

시도 뭔가 :

(function(){ 
    var instanciated = false; 
    window.myWorld = function() { 
    if(instanciated) throw new Error("myWorld can only be instanciated once!"); 
    instanciated = true; 
    var myPrivate = 1; 
    this.do1 = function(){alert(myPrivate);}; 
    } 
})(); 
1

을 확인 할 수 있습니다 IIFE 내부의 개인 변수 숨기기 :

var myWorld = (function() { 
    var myPrivate = 1; 
    return { ... }; 
}()); 
1
var a = new function myWorld() 
{ 
    var myPrivate=1; 
    this.do1=function(){alert(myPrivate);} ; 
} 

이렇게하면 myWorld을 기능 안에서만 사용할 수 있습니다. 이벤트에 액세스하지 못하게하려면 이름을 제거하십시오.

1

싱글 톤 패턴을 사용하여 개체의 한 인스턴스를 유지 관리 할 수 ​​있습니다. 다음과 같음 :

(function (global) { 
    var _inst; 

    global.myWorld = function() { 
     if (_inst) throw new Error("A myWorld instance already exists. Please use myWorld.getInstance()"); 
     _inst = this; 
    }; 

    global.myWorld.prototype = { 
     do1: function() { 
      console.log("do1"); 
     } 
    }; 

    global.myWorld.getInstance = function() { 
     if (_inst) return _inst; 
     return new myWorld(); 
    }; 
}(window)); 

var world = new myWorld(); 
var world2 = myWorld.getInstance(); 
console.log(world === world2); // true 
var world3 = new myWorld(); // throws Error 
관련 문제