← Back to NOTES 🌰 ← Effective JavaScript 🤿

← 아이템 56 - 불필요한 상태 유지를 피하라

핵심 요약

자세한 내용

위키 컨텐츠 예제

위키는 많은 콘텐츠를 생성하기 위한 간단한 텍스트 기반의 마크업 언어를 지원한다. 이런 위키 콘텐츠 작성을 위해서는 잘 구조화된 인터페이스가 필요하다.

예를 들어, 사용자가 MediaWiki 포맷을 사용하길 원한다면 (기본적인 다른 포맷들도 지원하는 상태):

var app = new Wiki(Wiki.formats.MEDIAWIKI);

// Wiki 인스턴스 객체 내부에 format을 저장
function Wiki(format){
    this.format = format;
}

// 위키를 읽는 사람이 페이지를 보기를 원할 때마다 내부 포매터를 사용하여 HTML 렌더링
Wiki.prototype.displayPage = function(source) {
    var page = this.format(source);
    var title = page.getTitle();
    var author = page.getAuthor();
    var output = page.toHTML();
}

클래스 기반 구현 vs 구조적 타입 지정

클래스 기반 구현

기본적인 Page 클래스 생성하고, 각 포맷별로 Page 클래스를 상속받아 구현:

function MWPage(source) {
    // 부모 생성자 호출
    Page.call(this, source);
    // ...
}

// MWPage는 Page를 상속한다.
MWPage.prototype = Object.create(Page.prototype);
MWPage.prototype.getTitle = /* ... */
MWPage.prototype.getAuthor = /* ... */
MWPage.prototype.toHTML = /* ... */

Wiki.formats.MEDIAWIKI = function(source) {
    return new MWPage(source);
}

여기서 MWPage는 위키 앱을 구현하는데 필요한 getTitle, getAuthor 등의 메서드들을 스스로 구현해야 하기에 (각 위키 포맷별로 동작이 다르므로) 실제 부모 클래스의 구현 코드를 상속받을 필요 없다.

구조적 타입 지정 (덕 타입핑)