본문 바로가기

Dev. Language/Javascript

생성자 체인과 상속


상속은 다른 객체의 메소드와 프로퍼티를 새로운 객체에 병합시키는 것이다. 이는 클래스 기반 개발의 근간이다.
새로운 클래스가 다른 클래스로부터 상속받은 기능 중 일부를 재정의할 수 있기 때문이다.
자바스크립트도 1.3 버전부터 apply와 call 함수를 이용하여 이를 흉내낼 수 있게 되었다.

apply와 call 메소드를 사용하면 다른 객체의 컨텍스트 내에서 메소드를 적용하거나 호출할 수 있다.
자식 객체 생성자 안에서 사용하면 부모 객체의 모든 프로퍼티와 메소드를 상속받도록 생성자들을 연결시킨다.
두 메소드는 전달되는 인자만 다르고 동작 방식은 같다.

    obj.call(this, arg1, arg2, ..., argn);
    obj.apply(this, arguments);

call 메소드에서는 첫 번째 인자에 자기 자신을 입력하고, 두 번째 인자부터는 전달하려는 인자들을 나열한다.
apply 메소드에는 자식 객체인 this, 그리고 자식 객체의 인자 "배열"을 전달한다.

인자 집합을 공유하는 경우에는 apply, 그렇지 않으면 call 메소드를 사용하도록 한다.

예제)
<!-- script -->
    function tune(title, type){ // 부모
       this.title = title;
       this.type = type;
       this.getTitle = function() {
        return "Song: "+this.title+" Type: "+this.type;
       }
    }
    
    function artist_tune(title, type, artist){ // 자식
       this.artist = artist;
       this.toString("Artist is "+artist);
       tune.apply(this, arguments); //  tune 함수를 호출해서 그 안의 this를 artist_tune으로 만든다.
       this.toString = function() {
         return "Artist: "+this.artist+" "+this.getTitle();
       }
    }
    
    artist_tune.prototype = new tune(); ★ // artist_tune이 tune을 알 수 있게 만든다. 이것이 생성자 체인.
    var song = new artist_tune("I want to hold your hand", "rock", "Beatles");
    alert(song.toString());

설명)
첫 번째로 생성되는 tune 객체에는 노래 제목과 장르 정보가 저장된다. (생성자)
그리고 두 정보를 문자열로 반환해주는 메소드를 가지고 있다. (getTitle)
두 번째 artist_tune 객체는 가수를 저장하는 프로퍼티(artist)와
모든 프로퍼티를 문자열로 반환하는 메소드를 가지고 있다.(toString)

artist_tune의 생성자에서는 tune 함수(객체)가 apply 메소드를 직접 호출하고 있다.
이렇게 하면 tune의 생성자가 호출되는데 이를 체인 생성자라고 하고-
결과적으로 artist_tune 객체가 tune 객체의 프로퍼티와 메소드를 상속받게 된다.
두 객체를 모두 정의하고 나서 artist_tune 프로토타입에 tune 생성자를 배정한다.