자바스크립트에서 static메서드 구현.


static 속성과 메서드란?

- 함수 객체의 인스턴스 맴버와는 달리 각 인스턴스에 따라 달라지지 않는 맴버 그룹을
가리키며,
인스턴스를 생성하지 않고 사용할 수 있어야 한다.

자바스크립트에서의 static 구현은 아래와 같이 함수 객체에 속성을 추가하는 방법으로
구현한다.


또한, 이 방법은 자바스크립트 디자인 패턴중 하나인 메모제이션 패턴에서도 활용된다.



1. 공개 static 맴버.

  1. // 일반적인 함수 객체의 인스턴스 맴버
  2. var constructor_fn = (function(doc, win){
  3.        
  4.         return function(x, y){
  5.        
  6.             this.x = x;
  7.             this.y = y;
  8.  
  9.             return this;
  10.         }
  11.  
  12. })(document, window);
  13.  
  14. var obj1 = new constructor_fn(1, 2);
  15. alert(obj1.x + ' '  + obj1.y); // 1, 2
  16.  
  17. var obj2 = new constructor_fn(3, 4);
  18. alert(obj2.x + ' '  + obj2.y); // 3, 4
  19.  
  20.  
  21. // 인스턴스 맴버에 따라 맴버 그룹이 달라지지 않으며, 인스턴스를 생성하지 않고 사용할 수 있다.
  22. var static_fn = (function(doc, win){
  23.        
  24.         return function(){
  25.             return this;
  26.         }
  27.  
  28. })(document, window);
  29.  
  30. static_fn.x = 1;
  31. static_fn.y = 2;
  32.  
  33. alert(static_fn.x + ' '  + static_fn.y); // 1, 2


2. 비공개 스태틱 맴버.

동일한 생성자 함수로 생성된 객체들이 공유하는 맴버이며, 생성자 외부에서는
접근할 수 없다.


즉, 비공개 메서드로 구현한다.

자바스크립트 클로져 및 비공개 맴버 작성법을 활용하여 비공개 static 맴버를 구현한다.




  1. // 동일한 생성자 함수(constructor_fn())로 생성된 객체들이 공유하는 맴버이며, 생성자 외부에서는 접근할 수 없다.
  2. var constructor_fn = (function(doc, win){
  3.        
  4.         var key = 0;
  5.  
  6.         return function(x, y){
  7.        
  8.             this.x = x;
  9.             this.y = y;
  10.             this.getKey = getKey;
  11.  
  12.             return this;
  13.         }
  14.  
  15.         function getKey(){
  16.             return key++;
  17.         }
  18.  
  19. })(document, window);
  20.  
  21.  
  22. var obj1 = new constructor_fn(1, 2);
  23. alert(obj1.x + ' '  + obj1.y +  ' ' + obj1.getKey() ); // 1, 2, 1
  24.  
  25. var obj2 = new constructor_fn(1, 2);
  26. alert(obj2.x + ' '  + obj2.y +  ' ' + obj2.getKey() ); // 3, 4, 2
  27.  
  28.  
  29.  
  30. // 위와 같이 유일키 반환 알고리즘에 쓰일 수 있다.