clone()
또는 Object.create()
등의 방식으로 새로운 객체를 생성동작 흐름
clone()
또는 Object.create(proto)
를 통해 해당 객체를 복제한다.proto
객체를 내부 [[Prototype]]
으로 설정하며, 그 프로토타입 체인을 통해 속성과 메서드를 상속받는다.Javascript에서의 프로토타입 체인
__proto__
: 비표준이지만 대부분 브라우저에서 지원되는 속성. 객체의 [[Prototype]]
을 참조하거나 설정할 수 있다.Object.getPrototypeOf(obj)
: 주어진 객체의 실제 프로토타입을 반환하는 메서드Object.setPrototypeOf(obj, proto)
: 객체의 프로토타입을 동적으로 변경 (성능 저하 및 권장되지 않음)Object.create(proto, [propertiesObject])
: 새로운 객체를 생성하고 프로토타입을 설정const dog = {
sound: "멍멍",
speak() {
return this.sound;
},
};
// 복제: dog을 프로토타입으로 갖는 새로운 객체
const puppy = Object.create(dog);
puppy.sound = "왈왈";
console.log(puppy.speak()); // "왈왈"
console.log(dog.speak()); // "멍멍"
Object.create(proto)
는 원형 객체의 프로토타입 체인을 유지하면서 복제한다.class Dog {
constructor(name) {
this.name = name;
}
speak() {
return `${this.name}: 멍멍!`;
}
}
const dog1 = new Dog("초코");
// 복제: 동일한 데이터를 가진 새 인스턴스를 생성
const dog2 = new Dog(dog1.name);
console.log(dog2.speak()); // "초코: 멍멍!"
console.log(dog1 === dog2); // false (복제된 다른 인스턴스)
class
문법도 내부적으로는 prototype
을 기반으로 동작한다.new
키워드는 생성자 함수를 호출하고, 내부적으로 새로운 객체를 생성한 뒤 해당 객체의 [[Prototype]]
을 클래스의 prototype
으로 설정한다.class Dog {
constructor(name) {
this.name = name;
}
speak() {
return `${this.name}: 멍멍!`;
}
}
class Puppy extends Dog {
constructor(name, age) {
super(name);
this.age = age;
}
speak() {
return `${super.speak()} (${this.age}살)`;
}
}
const puppy = new Puppy("초코", 1);
console.log(puppy.speak()); // "초코: 멍멍! (1살)"
extends
를 통해 상위 클래스의 prototype
체인을 자동으로 설정한다.[[Prototype]]
을 통해 상위 객체의 속성과 메서드를 상속받는다.Object.create(proto)
는 가장 대표적인 Prototype 패턴 방식이며, class + new
를 사용하는 생성자 기반 방식도 내부적으로는 prototype
체인을 활용한다.[[Prototype]]
을 유지하므로, 동일한 동작을 공유하면서도 개별 상태를 가질 수 있다.