ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • javascript 객체 리터럴 패턴과 생성자 패턴, prototype
    Knowledge/javascript 2019. 9. 9. 23:10
    반응형

    객체 리터럴 패턴을 활용하면 javscript 코드를 비슷한 기능끼리 묶을 수 있습니다.

     

    예를 들어 promotion과 관련된 기능만을

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    var promotionObj = {
            // 프로모션 템플릿 붙일 타겟
            imageTarget : document.querySelector(".visual_img"),
            // 프로모션 이미지 템플릿
            imageTemplate : document.querySelector("#imageTemplate").innerText,
            // 이미지 세팅
            setImage : function(productDetail){
                var imageBindTemplate = Handlebars.compile(this.imageTemplate);
                
                var resultHtml = '';
                resultHtml += imageBindTemplate(productDetail);
                
                // ticketBox에 BindTemplate 세팅
                this.imageTarget.innerHTML = resultHtml;
            }
    }

    이런 식으로 모아서 사용할 수 있는데 이 때의 imageTarget이나 imageTemplate은 고정이다. 

     

    즉 객체 리터럴 패턴으로 구현하면

    비슷한 기능을 하지만 대상은 다른 무언가를 구현할 때는 똑같은 코드를 대상만 바꿔 또 작성해야 한다는 얘기.

     

    이런 단점을 보완할 수 있는데 생성자 패턴이다. 이는 이렇게 사용할 수 있다

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
        function promotionObj(imageTarget, imageTemplate) {
        
            // 프로모션 템플릿 붙일 타겟
            this.imageTarget = imageTarget;
            // 프로모션 이미지 템플릿
            this.imageTemplate = imageTemplate;
            // 뒤로 가기 버튼 클릭 이벤트 등록
            // 이미지 세팅
            this.setImage = function(productDetail){
                var imageBindTemplate = Handlebars.compile(this.imageTemplate);
                
                var resultHtml = '';
                resultHtml += imageBindTemplate(productDetail);
                
                // ticketBox에 BindTemplate 세팅
                this.imageTarget.innerHTML = resultHtml;
            }
     
     
        // 다른 타겟으로 promotion1 객체 생성    
        var promotion1 = new promotionObj('다른 타켓''다른 템플릿');
        // 또다른 타겟으로 promotion2 객체 생성
        var promotion2 = new promotionObj('또다른 타켓''또다른 템플릿');
     
        // 다른 타겟에 이미지 세팅
        promotion1.setImage();
     
        // 또다른 타겟에 이미지 
        promotion2.setImaget();
            
    }
     

     

     

    이렇게 객체를 함수 형태로 선언해서 클래스를 객체로 생성하듯 

    다른 파라미터를 넣어주면 코드의 중복을 막을 수 있다.

     

    다만 보다시피 여기서도 코드의 불필요한 중복은 있다.

    바로 setImage 부분인데 완전히 동일한 코드가 객체를 생성할 때 마다 메모리를 차지하는 비효율을 야기한다

     

    그러나 이도 역시 극복가능하다. prototype을 활용하면 되는데 

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
        function promotionObj(imageTarget, imageTemplate) {
        
            // 프로모션 템플릿 붙일 타겟
            this.imageTarget = imageTarget;
            // 프로모션 이미지 템플릿
            this.imageTemplate = imageTemplate;
            // 뒤로 가기 버튼 클릭 이벤트 등록
            // 이미지 세팅
        }
     
        promotionObj.prototype = {
            
            // 이미지 세팅
            setImage : function(productDetail){
                var imageBindTemplate = Handlebars.compile(this.imageTemplate);
                
                var resultHtml = '';
                resultHtml += imageBindTemplate(productDetail);
                
                // ticketBox에 BindTemplate 세팅
                this.imageTarget.innerHTML = resultHtml;
            }
     
        }
     
        // 다른 타겟으로 promotion1 객체 생성    
        var promotion1 = new promotionObj('다른 타켓''다른 템플릿');
        // 또다른 타겟으로 promotion2 객체 생성
        var promotion2 = new promotionObj('또다른 타켓''또다른 템플릿');
     
        // 다른 타겟에 이미지 세팅
        promotion1.setImage();
     
        // 또다른 타겟에 이미지 세팅
        promotion2.setImaget();
            
    }
     

     

    이렇게 prototype을 선언하고 그 안에 함수를 집어넣어주면 

    굳이 객체가 생성할 때마다 메모리를 할당하지 않고도

    promotionObj를 구현한 객체라면 어디서든 동일한

    (promotion1.setImage() === promotion2.setImage() 를 하면 true가 나온다 ) setImage를 사용할 수 있다. 

     

    반응형

    댓글

Designed by Tistory.