new Object()는 Factory일까?


자바스크립트에서 객체를 생성하는 방법 중 Object() 생성자 함수를 사용한
new Object() 라는 문법이 있습니다.


"하지만 이 방법은 추천 하지 않는 방법이기도 합니다."



이유를 알아보기 위해 아래 코드를 살펴 보겠습니다.

  1. alert(new Object().constructor === Object); // true
  2. alert(new Object(1).constructor === Number); // true
  3. alert(new Object('string').constructor === String); // true
  4. alert(new Object(true).constructor === Boolean); // true 
 
위의 결과를 보면 Object 생성자 함수의 인자 값에 따라 객체 생성자의 변화를
볼 수 있습니다.


즉, Object 생성자 함수는 전달되는 인자 값에 따라 다른 내장 생성자에 객체 생성을
위임 하여, 인자값에 따라 각기 다른 객체를 생성 합니다.


또한, 그것은 객체 생성시 예기치 못한 결과가 나올 수도 있다는 얘기며, 이는 생각지
못한 객체를 반환 받을 수 도 있다는 것 입니다.



그리고 이와 같은 동작 방식으로 보아 Object 생성자함수는 팩토리패턴을 사용하고 있다는
것 또한 알 수 있습니다.



"팩토리 패턴의 정의는 이와 같습니다."

보통 팩토리 패턴의 목적은 객체들을 생성 하는것에 있으며, 흔히 클래스 내부 또는 클래스의 스태틱 메소드로 구현 합니다.

또한 팩토리 패턴은 사용자가 컴파일 타임에 구체적인 타입(클래스)을 모르고도 객체를 생성할 수 있게 해주는 메소드 입니다.



아래는 팩토리패턴을 구현한 예제코드 입니다.

  1. function factory(id){
  2.    
  3.     if (typeof window[id] === 'function') return new window[id];
  4.     else return null;
  5. }
  6.  
  7. function class1(){
  8. }
  9.  
  10. function class2(){
  11. }
  12.  
  13. function class3(){
  14. }
  15.  
  16. alert(factory('class1'));
  17. alert(factory('class2'));
  18. alert(factory('class3'));
  19. alert(factory('class4'));
 

아래는 팩토리패턴의 정의와 같이 구현한 예제코드 입니다.

  1. function main(){
  2. }
  3.  
  4. main.factory = function(arg){
  5.    
  6.     var cType = null;
  7.    
  8.     if (typeof arg === 'string') cType = main.string;
  9.     else if (typeof arg === 'number') cType = main.number;
  10.     else if (typeof arg === 'boolean') cType = main.boolean;
  11.    
  12.     if (typeof cType !== 'function') return null;
  13.  
  14.     return new cType(arg);
  15. }
  16.  
  17. main.string = function string(){
  18.     return this;
  19. }
  20.  
  21. main.number = function number(){
  22.     return this;
  23. }
  24.  
  25. main.boolean = function boolean(){
  26.     return this;
  27. }
  28.  
  29.  
  30. alert(main.factory('string').constructor); // string()
  31. alert(main.factory(1).constructor); // number()
  32. alert(main.factory(true).constructor); // boolean()

간단히 설명 하자면, 위 코드는 팩토리 패턴의 정의와 같이 클래스의 스태틱 메소드
사용하여 구현 하였으며, 구체적인 타입 클래스를 모르고도 유연성 있게 객체를
생성
할 수 있게 작성된 것 입니다.