JavaScript는 프로토타입 기반의 객체 지향 언어입니다. 이는 클래스 기반의 언어와는 다른 방식으로 객체를 생성하고 상속을 구현합니다.
프로토타입 체인
프로토타입 체인은 JavaScript의 객체 간 상속을 구현하는 메커니즘입니다. 모든 객체는 자신의 프로토타입을 가리키는 __proto__
라는 내부 프로퍼티를 가지고 있습니다.
객체의 프로토타입은 다른 객체로서 동작할 수 있습니다. 즉, 어떤 객체의 프로퍼티나 메서드에 접근하려고 할 때, 해당 객체에 해당 프로퍼티나 메서드가 없으면 프로토타입 체인을 따라가며 상위 객체에서 해당 프로퍼티나 메서드를 찾습니다. 이 과정은 객체의 프로토타입을 참조하는 __proto__
를 계속 따라가며 진행됩니다.
아래는 프로토타입 체인을 나타내는 예시입니다.
let person = {
name: "Jane",
age: 25,
};
let student = {
major: "Computer Science",
};
student.__proto__ = person;
console.log(student.name); // "Jane"
console.log(student.age); // 25
위 예시에서 student
객체는 person
객체를 프로토타입으로 가지고 있습니다. 따라서 student
객체에서 name
과 age
프로퍼티를 찾지 못하면 프로토타입 체인을 따라 person
객체에서 해당 프로퍼티를 찾아 출력합니다.
상속
JavaScript에서는 프로토타입 체인을 이용하여 상속을 구현할 수 있습니다. 객체의 프로토타입으로 기능을 정의한 후, 새로운 객체를 생성할 때 해당 프로토타입을 상속받도록 설정할 수 있습니다.
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.greet = function() {
console.log("Hello, my name is " + this.name);
}
function Student(name, age, major) {
Person.call(this, name, age);
this.major = major;
}
Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;
let jane = new Student("Jane", 25, "Computer Science");
jane.greet(); // "Hello, my name is Jane"
위 예시에서 Person
함수는 name
과 age
프로퍼티를 가지는 객체를 생성하는 생성자 함수입니다. 해당 생성자 함수의 프로토타입에 greet
메서드를 추가하고, Student
함수는 Person
생성자 함수를 호출하여 name
과 age
프로퍼티를 초기화합니다. 그리고 Student
함수의 프로토타입을 Person
생성자 함수의 프로토타입을 상속하도록 설정합니다.
이를 통해 jane
객체는 Person
객체의 프로퍼티와 메서드를 상속받아 사용할 수 있습니다.
결론
JavaScript의 프로토타입 체인과 상속은 객체 지향 프로그래밍에서 클래스 기반의 상속과는 다른 접근 방식을 제공합니다. 프로토타입 체인을 통해 객체 간의 상속을 구현하고, 상속을 통해 코드의 재사용성을 높일 수 있습니다.