ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JavaScript] Instantiation Patterns
    카테고리 없음 2020. 2. 21. 23:16

    객체 지향 프로그래밍은 수작업이 아닌 공장에서의 생산작업을 의미한다. 하나의 공장(원형)을 만든 후, 같은 성격의 제품들(인스턴스)을 계속해서 찍어내는 것이다. 자바스크립트에 class 가 등장하면서, 공장을 만들어내기가 훨씬 쉬워졌지만, 그 전에는 어떤 방식으로 인스턴스들을 만들어냈을까?

     

    크게 다음의 네 가지 방법이 있다. 이들은 레거시 코드로 이와 같은 방식으로 코드를 작성할 일은 많지 않다. 하지만 이미 만들어진 코드를 이해하는 데 중요하므로 알아둘 필요가 있다. 

     

    1. Functional

    var Shoes = function(brand){
      var shoeInstance = {};
      shoeInstance.brand = brand;
      shoeInstance.run = function(){
        console.log('I am running with ' + brand);
      }
      return shoeInstance;
    }
    
    var nike = Shoes('nike'); 

    생성자함수를 이용해 객체를 만들어내는 방식이다. 함수 내 프로퍼티와 메소드가 모두 들어가 있다. 이 경우에는 인스턴스들이 생겨날 때마다 프로퍼티와 메소드가 새로 생겨난다. 메모리 사용 관점에서 효율적이지 못하다.

     

     

    2. Functional Shared

    // functional shared
    var extend = function(to, from){
      for(let key in from){
        to[key] = from[key];
      }
    };
    
    var shoeMethods = {};
    shoeMethods.run = function(){
      console.log('I am running with ' + this.brand);
    }
    
    var Shoes = function(brand){
      var shoeInstance = {};
      shoeInstance.brand = brand;
      extend(shoeInstance, shoeMethods)
      return shoeInstance;
    }
    
    var nike = Shoes('nike'); 

    functional 방식의 메모리 문제를 해결한 방식이 functional shared 방식이다. 외부에 있는 shoeMethods 객체에 메소드를 따로 저장하고, 이를 인스턴스들이 참조할 수 있도록 했다(share). 따라서 인스턴스들이 생겨날 때마다 메소드 때문에 추가적으로 메모리를 차지하지 않는다. 

     

    3. Prototypal

    // prototypal
    var shoeMethods = {};
    shoeMethods.run = function(){
      console.log('I am running with ' + this.brand);
    }
    
    var Shoes = function(brand){
      var shoeInstance = Object.create(shoeMethods);
      shoeInstance.brand = brand;
      return shoeInstance;
    }
    
    var nike = Shoes('nike'); 

    functional shared 와 유사하나, object.create() 를 사용해 코드를 더 간결하게 만들었다. object.create(obj) 는 obj를 프로토타입으로 하는 객체를 생성하는 함수다. 위 코드에서는 메소드가 담긴 객체 shoeMethods 를 프로토타입으로 하는 객체를 만들어 안에 프로퍼티들을 추가하는 방식으로 인스턴스를 만들어냈다. 

     

    4. Pseudoclassical

    // pseudoclassical
    var Shoes = function(brand){
      this.brand = brand;
    };
    
    Shoes.prototype.run = function(){
      console.log('I am running with ' + this.brand);
    };
    
    var nike = new Shoes('nike'); 

    네 가지 중 가장 간결한 방식이다. 유의할 점은, 인스턴스를 만들 때 'new' 키워드를 꼭 붙여주어야 한다는 점이다.

     

    댓글