자바스크립트의 상속 (inheritance)
상속이란?
자바에서 상속은 클래스 단위로 이루어졌다.
자손 클래스는 'extend'를 통해 부모 클래스의 속성값을 물려 받았다.
자바 스크립트에서도 상속은 비슷한 의미로 쓰인다.
하지만 그 대상이 다르다. 자바 스크립트에서 상속은 클래스가 아닌 객체를 기준으로 이뤄진다.
왜 객체?
자바 스크립트는 과거 클래스가 없을 때부터 객체를 중심으로 프로그램을 짰다.
그래서 클래스 대신 객체를 상속하는 것으로 클래스를 대신했다.
그리고 이 중심에는 'prototype'이라는 속성이 있다.
프로토타입(proto type)
프로토타입(proto type)이란 자바 스크립트에 존재하는 모든 객체가 가지는 속성값을 말한다.
이 속성은 객체로서 상속 과정에 필요한 다양한 정보를 담고 있고 사용자가 추가, 수정할 수 있다.
그리고 모든 상속은 이 프로토타입을 기준으로 이뤄진다.
프로토타입의 상속
<body>
<script>
function Person(name){ // Person 객체 생성
this.name = name;
}
Person.prototype.introduce = function(){
// Person.prototype.introduce에 함수를 저장
return "나는 "+this.name+"입니다.";
}
var p1 = new Person("영수"); // Person 객체 생성
console.log(p1.introduce()); // Person 객체 p1으로 introduce에 저장된 함수 호출
function Student(name){ // student 객체 생성
this.name = name;
}
Student.prototype = new Person(); // Student.prototype 속성에 new와 함께 Person 객체 생성을 하도록 저장
var s1 = new Student("철수"); // Student 객체 생성
console.log(s1.introduce()); // Student으로 Person에서 만들었던 함수 introduce 호출
</script>
</body>
다음은 프로토타입 상속의 예시다.
'Person'이라는 객체를 만들어주고 객체에 'introduce'라는 함수를 추가해줬다.
'Student'라는 객체를 만들어주고, 해당 객체의 프로토타입에 'new Person'이라는 'Person' 객체의 객체 생성자를 저장했다.
그 결과는 'Student' 객체를 만들 때 프로토타입이 속성이 생성되는데 이 프로토타입에 'Person' 객체의 생성자가 저장되있어서 'Student'를 통해 'Person'의 프로퍼티와 함수를 사용할 수 있게 된 것이다.
프로토타입 상속 과정
<body>
<script>
function First(){}
First.prototype.test = "상속"; // first 객체의 프로토타입에 프로퍼티 test 저장
function Second(){}
Second.prototype = new First(); //Second의 프로토타입에 first 객체 생성자 추가
function Third(){}
Third.prototype = new Second(); //Third의 프로토타입에 Second 객체 생성자 추가
var test = new Third(); // third의 객체 생성
console.log(test.test);
// third의 객체로 Fisrt 프로토 타입에 저장한 프로퍼티 test출력
</script>
</body>
직접적인 상속 과정이 복잡하다면 위 코드를 보면 더 쉽게 이해가 가능하다.
기본적으로 자바 스크립트의 모든 객체는 프로토타입이라는 객체 형태의 속성 값을 생성과 동시에 부여 받게 된다.
그리고 이 프로토타입이란 속성에 상속받을 생성자를 부여함으로써 객체를 새로 생성할 때마다 상속 받은 생성자를 같이 생성하기 때문에 상속을 통해 받은 프로퍼티와 메소드를 사용할 수 있는 것이다.
위의 코드를 해석하자면 다음과 같다.
'Third' 객체의 프로토 타입은 Second의 생성자를 저장했다.
'Second' 객체의 프로토 타입은 First의 생성자를 저장했다.
즉 'Third' 객체를 새로 생성하게 될 때 마다 프토로타입에 저장된 생성자를 통해 'Second'와 'First'의 객체까지 생성해서 사용할 수 있게 만드는 것이다.
이렇게 상속을 통해 이뤄지는 프로토타입의 연쇄 작용을 프로토타입 체인이라 한다.