Object.create
메서드는 주어진 프로토타입 객체를 사용하여 새로운 객체를 생성합니다. 이 메서드는 객체 지향 프로그래밍에서 상속 및 프로토타입 기반의 패턴을 구현하는 데 자주 사용됩니다.
Object.create
의 사용법은 다음과 같습니다:
Object.create(proto[, propertiesObject])
proto
: 새로 생성된 객체의 프로토타입이 될 객체입니다.propertiesObject
(선택적): 새로 생성된 객체의 속성을 정의하는 객체입니다. 이 객체는 Object.defineProperty
로 정의된 속성을 포함할 수 있습니다.이제 Object.create
의 내부 동작을 살펴보겠습니다.
proto
를 프로토타입으로 갖는 빈 객체입니다.[[Prototype]]
내부 슬롯을 proto
로 설정합니다. 이로써 새로운 객체는 proto
객체를 상속받게 됩니다.propertiesObject
가 제공된 경우, 이 객체에 정의된 속성을 새로 생성된 객체에 추가합니다. propertiesObject
는 속성 이름을 키로 가지고 해당 속성의 설정을 값으로 가지는 객체입니다. 각 속성은 Object.defineProperty
를 사용하여 정의됩니다.다음은 Object.create
를 사용한 예제입니다:
const person = {
greet() {
console.log(`Hello, ${this.name}!`);
}
};
const john = Object.create(person, {
name: {
value: 'John',
enumerable: true,
writable: true,
configurable: true
}
});
john.greet(); // 출력: Hello, John!
위 예제에서 person
객체는 greet
메서드를 갖고 있습니다. john
객체는 person
객체를 프로토타입으로 갖으면서 name
속성을 가진 새로운 객체입니다. Object.create
를 사용하여 john
객체를 생성하면 john
객체는 person
객체의 greet
메서드를 상속받습니다. 따라서 john.greet()
를 호출할 때 Hello, John!
이 출력됩니다.
Object.create
는 객체를 생성하고 상속 관계를 설정하는 데 유용한 메서드입니다. 이를 통해 객체 지향 프로그래밍의 상속 패턴을 자바스크립트에서 구현할 수 있습니다.
Object.create
메서드의 내부 동작을 좀 더 상세히 분석해보겠습니다. 이를 이해하기 위해 ObjectOrdinaryCreate
라는 추상 연산을 사용하여 설명하겠습니다.
ObjectOrdinaryCreate
는 proto
를 프로토타입으로 가지는 빈 객체를 생성하는 추상 연산입니다. Object.create(proto)
는 실제로 ObjectOrdinaryCreate(proto, %Object.prototype%)
와 동일합니다. 이제 ObjectOrdinaryCreate
의 내부 동작을 살펴보겠습니다.
obj
라고 합시다.obj
의 [[Prototype]]
내부 슬롯을 proto
로 설정합니다. 이로써 obj
는 proto
객체를 상속받게 됩니다.obj
를 반환합니다.이제 Object.create
메서드의 내부 동작과 ObjectOrdinaryCreate
추상 연산을 연관지어 설명해보겠습니다.
const obj = Object.create(proto);
Object.create(proto)
가 호출됩니다.ObjectOrdinaryCreate(proto, %Object.prototype%)
가 호출됩니다.ObjectOrdinaryCreate
의 내부 동작에 따라 새로운 빈 객체 obj
가 생성됩니다.obj
의 [[Prototype]]
내부 슬롯이 proto
로 설정됩니다. 이로써 obj
는 proto
객체를 상속받게 됩니다.obj
를 반환합니다.즉, Object.create(proto)
는 ObjectOrdinaryCreate
추상 연산을 호출하여 proto
를 프로토타입으로 가지는 새로운 빈 객체를 생성하고 반환합니다.
추가로, ObjectOrdinaryCreate
는 Object.prototype
을 기준으로 프로토타입 체인을 형성합니다. proto
객체가 null
인 경우, obj
는 프로토타입이 없는 객체가 됩니다. proto
객체가 Object.prototype
인 경우, obj
는 Object.prototype
의 모든 메서드와 속성을 상속받는 객체가 됩니다. 따라서 obj
는 Object.prototype
에 정의된 메서드들을 사용할 수 있게 됩니다.
아래 예제를 통해 Object.create
의 내부 동작과 ObjectOrdinaryCreate
추상 연산을 시각적으로 이해해보겠습니다:
const proto = {
greet() {
console.log('Hello!');
}
};
const obj = Object.create(proto);
obj.greet(); // 출력: Hello!
위 예제에서 proto
객체는 greet
메서드를 가지고 있습니다. Object.create(proto)
를 호출하여 obj
객체를 생성하면 obj
객체는 proto
객체를 프로토타입으로 상속받게 됩니다. 따라서 obj.greet()
를 호출할 때 Hello!
가 출력됩니다.
Object.create
를 사용하여 객체를 생성하면서 원하는 프로토타입을 명시적으로 설정할 수 있습니다. 이를 통해 프로토타입 기반의 상속과 객체 구조를 유연하게 구성할 수 있습니다.