
책 정보
이 글의 목적 및 대상 독자
class 문법의 차이를 알고 싶은 분 super 호출, constructor 복구 등 심화 내용을 실습해 보고 싶은 분 클래스는 “비슷한 성격의 객체를 찍어내기 위한 설계도” 역할을 합니다.
구조(속성)와 행위(메서드)를 한곳에 정의해, 같은 형태의 여러 인스턴스를 일관성 있게 만들 수 있죠.
인스턴스는 클래스라는 설계도로 실제로 생성된 객체를 의미합니다.
각 인스턴스는 자신만의 상태(프로퍼티)를 가지며, 클래스에 정의된 메서드를 공유합니다.
정의 한 줄 요약
클래스 = 설계도, 인스턴스 = 설계도로 찍어낸 객체
ES6 이전에는 함수와 프로토타입으로 클래스처럼 동작을 흉내 냈습니다.
// 생성자 함수
function User(name, age) {
this.name = name;
this.age = age;
}
// 공통 메서드는 prototype에 정의
User.prototype.info = function() {
return `${this.name} (${this.age})`;
};
const u = new User('Lee', 30);
console.log(u.info()); // "Lee (30)"
new User() → 빈 객체 생성 → this 바인딩 → proto가 User.prototype 참조u.__proto__
└─ User.prototype
└─ Object.prototype
└─ null
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function() {
console.log(`${this.name} makes a noise.`);
};
function Dog(name) {
Animal.call(this, name); // super 역할
}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog; // constructor 복구
Dog.prototype.speak = function() {
console.log(`${this.name} barks.`);
};
const d = new Dog('Rex');
d.speak(); // "Rex barks."
Dog.prototype = Object.create(Animal.prototype) 하면Dog.prototype.constructor가 사라집니다.Dog.prototype.constructor = Dog로 재설정해야 올바르게 식별됩니다.Animal.prototype.method.call(this, …)d.__proto__
└─ Dog.prototype
└─ Animal.prototype
└─ Object.prototype
└─ null
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
constructor(name) {
super(name); // 반드시 호출해야 this 사용 가능
}
speak() {
super.speak(); // 부모 메서드 호출
console.log(`${this.name} barks.`);
}
}
const d2 = new Dog('Buddy');
d2.speak();
// "Buddy makes a noise."
// "Buddy barks."
💡 Tip
extends사용 시 프로토타입 체인이 내부에서 자동 설정됩니다.super(...)는 생성자 내에서만,super.method()는 클래스 메서드 내부에서만 사용 가능합니다.