3.6.1 고전적 상속 흉내 내기
자바스크립트에서 고전적 상속(classical inheritance)을 모방할 수 있는 건 순전히 함수 프로토타입 덕분이다. 앞 절의 Marsupial 함수를 확장해 캥거루에 hop 함수라는 특정 프로퍼티를 넣는다고 하자.
프로토타입에 isAwake 함수를 추가하고 new 키워드 사용을 강제한 예제 3-7의 Marsupial 함수를 다시 보자.
function Marsupial(name, nocturnal) { if (!(this instanceof Marsupial)) { throw new Error("이 객체는 new를 사용하여 생성해야 합니다"); } this.name = name; this.isNocturnal = nocturnal; } Marsupial.prototype.isAwake = function(isNight) { return isNight === this.isNocturnal; }
Marsupial 함수 프로토타입에 hop 함수를 추가(또는 Marsupial 함수로 생성한 객체 인스턴스에 직접 추가)할 수 있지만, 과연 그렇게 하는 것이 최선일까? 그럼 Marsupial 생성자 함수로 만든 객체 인스턴스는 모두 hop 함수를 달고 다니게 될 텐데……?
캥거루만 껑충 뛰게(hop) 하고 싶지만, Marsupial을 바꾸면 전부 다 껑충 뛰게 될 것이다. 이는 개방/폐쇄 원칙에도 맞지 않는다.