2009-09-08 2 views
15

는 MDC에서이 발견하지만 난이 Javascript 개체 리터럴 코드 조각에 개인 변수를 추가하는 방법은 무엇입니까?

var dataset = { 
    tables:{ 
     customers:{ 
      cols:[ /*here*/ ], 
      rows:[ /*here*/ ] 
     }, 
     orders:{ 
      cols:[ /*here*/ ], 
      rows:[ /*here*/ ] 
     } 
    }, 
    relations:{ 
     0:{ 
      parent:'customers', 
      child:'orders', 
      keyparent:'custid', 
      keychild:'orderid', 
      onetomany:true 
     } 
    } 
} 

에 내가 자바 스크립트 OOP를 이해하는 방법을 개인 변수를 추가하고 싶었 더라면, 나는 dataset.tables.customers.cols에 액세스 [0이있을 것이다 방법 ] 해당 항목이있는 경우.
그러나 개인 변수를 고객에게 배치하려면 어떻게해야합니까?
var index = 0;을 추가하면 런타임 오류가 발생합니다.

답변

25

함수가 포함되지 않은 "개인"변수를 사용할 수 없습니다. 함수는 자바 스크립트에서 새로운 범위를 소개하는 유일한 방법입니다.

그러나 결코 당신이 개체

var dataset = { 
    tables: { 
    customers:(function(){ 
     var privateVar = 'foo'; 
     return { 
     cols:[ /*here*/ ], 
     rows:[ /*here*/ ] 
     } 
    }()), 
    orders:{ 
     cols:[ /*here*/ ], 
     rows:[ /*here*/ ] 
    } 
    }, 
    relations: [{ 
    parent:'customers', 
    child:'orders', 
    keyparent:'custid', 
    keychild:'orderid', 
    onetomany:true 
    }] 
}; 

과 기능이 종류를 얻기 위해 적절한 장소에 기능을 추가 할 수 있습니다 두려워하지만이 많은 우리를 얻을하지 않습니다. 이것은 여전히 ​​대부분 문자 그대로의 객체입니다. 이러한 유형의 "Private"변수는 메서드가 없으므로 아무런 의미가 없습니다. 실제로 함수를 추가하여 만든 범위의 변수 (클로저)를 실제로 읽거나 사용하지 않습니다.

하지만 방법이 있다면 실제로 유용해질 수 있습니다.

var dataset = { 
    tables: { 
    customers:(function(){ 
     var privateVar = 'foo'; 
     return { 
     cols:[ /*here*/ ], 
     rows:[ /*here*/ ], 
     getPrivateVar: function() 
     { 
      return privateVar; 
     } 
     }; 
    }()), 
    orders:{ 
     cols:[ /*here*/ ], 
     rows:[ /*here*/ ] 
    } 
    }, 
    relations: [{ 
    parent:'customers', 
    child:'orders', 
    keyparent:'custid', 
    keychild:'orderid', 
    onetomany:true 
    }] 
}; 

alert(dataset.tables.customers.getPrivateVar()); 
9

JavaScript에는 더 엄격한 언어로 제공되는 액세스 제어가 없습니다. closures을 사용하여 객체의 데이터에 대한 개인 액세스를 시뮬레이션 할 수 있지만, 예를 들어 생성 된 객체가 아닌 객체 리터럴 (간단한 데이터 구조)이 있습니다.

'private'멤버의 일반적인 기술은 멤버 함수를 통해서만 액세스 할 수 있다는 것을 의미하며 개체를 생성하는 데 생성자를 사용해야한다는 의미입니다. 리터럴 구문은 공용 데이터 및 함수가있는 데이터 구조 또는 경량 객체에 사용됩니다.

개인 폐쇄 패턴을 사용하는 경우의 문제점은 리터럴 내의 필드가 공용 범위에 있지만, 변수가 함수에 정의되어 로컬에서 범위가 지정되기 때문에 클로저에 의해 제공된 개인 정보 보호라는 것입니다. 리터럴을 복제하고 개인 필드를 추가하는 함수를 만들거나 개인 데이터가있는 공용 필드를 추가 할 수 있습니다. 또한 클로저를 멤버로 추가 할 수 있으므로 개체 private 대신 메서드 private 인 개인 필드를 만듭니다.

dataset = { 
    secretCounter: ( 
     function() { 
     var c = 0; 
     return function() { return ++c; } 
    })(),  
    ... 

그래서 dataset.secretCounter()는 해당 기능에 대한 개인 인 varable c 있습니다.

+0

오! 네가 나를 궤도에 돌려 보낸 것 같아. 데이터 구조는 단지 데이터를 선언했기 때문에 private 멤버를 보유 할 수 없습니다 (모든 것이 public입니다!) 그러나 이것을 정적 클래스/singlelton (var obj = function() {}();)로 다시 작성하면 그렇게. 그 맞습니까? 고맙습니다. :) –

4

자바 스크립트의 개인 변수는 클로저 내부의 var 키워드를 사용하여 수행됩니다. 권한이 부여 된 메소드 및 속성 만 액세스 할 수 있습니다. 다음과 같이하십시오.

function dataset() 
{ 
var private_stuff = 10; // private 
this.foo = new function() { alert(private_stuff); } // priviliged 
return { 
    tables:{ 
     customers:{ 
       cols:[ ], 
       rows:[ ] 
     }, 
     orders:{ 
       cols:[ ], 
       rows:[ ] 
     } 
    }, 
    relations:{ 
     0:{ 
       parent:'customers', 
       child:'orders', 
       keyparent:'custid', 
       keychild:'orderid', 
       onetomany:true 
     } 
    } 
}; // public 
} 

var d = new dataset; 
alert(d.foo()); 
+2

var d = 새 데이터 집합(); 또는 : var d = dataset(); – pkario