ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (loading)class
    Javascript 2020. 5. 10. 23:55

     

    class

    class는 객체를 만드는 공장이라고 할 수 있습니다.

    ECMAScript 6부터 지원하기 시작했기 때문에 이전까지는

    비슷한 작동을 하는 네가지 방식을 사용해야 했습니다.

     

    Instantiation Patterns

    Functional / Functional Shared / Prototypal / Pseudoclassical

    이 중에서 Pseudoclassical 방식을 살펴 보겠습니다.

    //menu라는 단일 프로퍼티를 생성하는 생성자 함수
    function Order(menu) {
        this.menu = menu;
    }
    
    //prototype에 할당되는 message메서드
    Order.prototype.message = function() {
        console.log(this.menu + "가 주문되었습니다");
    }
    
    //new 키워드를 통해 새로운 인스턴스 생성
    let steven = new Order("커피");
    steven.message();    // "커피가 주문되었습니다"
    
    //prototype 상속을 통해 Order와 Object 인스턴스로 간주됩니다.
    console.log(steven instanceof Order);	// true
    console.log(steven instanceof Object);	// true

     

    class 선언은 Pseudoclassical 방식과 유사하지만 내부에 직접 생성자를 정의할 수 있고, 메서드가 간결한 구문을 사용합니다.

    class Order{
        //menu라는 단일 프로퍼티를 생성하는 생성자
        constructor(menu){
            this.menu = menu;
        }
        
        //prototype에 할당되는 message메서드
        message(){
        	console.log(this.menu + "가 주문되었습니다");
        }
    }
    
    let steven = new Order("커피");
    steven.message();    // "커피가 주문되었습니다"
    
    console.log(steven instanceof Order);	// true
    console.log(steven instanceof Object);	// true
    class Order{
        constructor(menu){
            //객체가 생성되는 과정에서 실행
        }
        
        
        message(){
        	//prototype에 할당되는 메서드로써 prototype과 function을 생략가능
            //message()  ===  Order.prototype.message = function() {}
        }
    }

     

     

    상속 (Inheritance)

    먼저, class가 생기기전에 상속하는 방법을 보겠습니다.

    function Order(menu, count){
        this.menu = menu;
        this.count = count;
    }
    Order.prototype.message = function(){
        return "주문되었습니다"
    }
    
    function OptionSize(menu, count, size){
        //class의 super와 같이 부모를 호출한다. 하지만 message 메서드를 사용할 수 없다.
        Order.call(this, menu, count);
        this.size = size;
    }
    
    //__proto__로 연결한다.
    OptionSize.prototype.__proto__ = Order.prototype;
    
    //새로운 객체를 만들어서 
    OptionSize.prototype = Object.create(Order.prototype);
    OptionSize.prototype.constructor = OptionSize;

    class를 통해서 객체를 만들기 편해졌지만 만약에 어떠한 상황에서만 필요한 메서드를 만들고 싶다면 어떻게 하면 될까요?

    보편적이지 않은 상황때문에 메서드를 만들어 놓는 일을 피하기 위해서 상속을 사용할 수 있습니다. 상속하는 방법말고도 코드를 수정하거나 새로운 class를 만들 수 있지만 코드가 반복되기 때문에 상속하는 방법으로 코드를 간결하게 만듭니다.

     

    class Order{
        constructor(menu, count){
            this.menu = menu;
            this.count = count;
        }
        message(){
            return this.menu + this.count + "개가 주문되었습니다";
        }
    }
    
    class Option extends Order{
        size(){
        	return this.menu + "를 그란데 사이즈로 주세요";
        }
    }
    
    let steven = new Option('라떼', 2);
    steven.size()	// "라떼를 그란데 사이즈로 주세요"
    
    
    //super키워드
    //만약에 부모 class에 없는 파라미터를 받아서 사용하고 싶다면 super 키워드를 사용
    class OptionSize extends Order{
        constructor(menu, count, size){
    
            //super를 사용하면 부모 class의 생성자가 호출되고 프로퍼티가 생성 
            super(menu, count);
            this.size = size;
        }
        coffeeOrder(){
            return this.size + "사이즈의 " + super.message()
            //super.message() 부모 class의 메서드를 사용가능
        }
    }
    
    let steven = new OptionSize('라떼', 1, '벤티')
    steven.coffeeOrder()	// "벤티사이즈의 라떼1개가 주문되었습니다"

     

     

     

     

     

    'Javascript' 카테고리의 다른 글

    프라미스(Promise)  (0) 2020.06.09
    값과 참조 (Value & Reference)  (0) 2020.05.16
    (loading)Prototype Chain  (0) 2020.05.08
    실행 컨텍스트 (execution context)  (0) 2020.04.30
    package.json  (0) 2020.04.27

    댓글

Designed by CHANUL