Object.create ObjectOrdinaryCreate

agnusdei·2023년 7월 10일
0

Object.create 메서드는 주어진 프로토타입 객체를 사용하여 새로운 객체를 생성합니다. 이 메서드는 객체 지향 프로그래밍에서 상속 및 프로토타입 기반의 패턴을 구현하는 데 자주 사용됩니다.

Object.create의 사용법은 다음과 같습니다:

Object.create(proto[, propertiesObject])
  • proto: 새로 생성된 객체의 프로토타입이 될 객체입니다.
  • propertiesObject (선택적): 새로 생성된 객체의 속성을 정의하는 객체입니다. 이 객체는 Object.defineProperty로 정의된 속성을 포함할 수 있습니다.

이제 Object.create의 내부 동작을 살펴보겠습니다.

  1. 빈 객체를 생성합니다. 이 객체는 proto를 프로토타입으로 갖는 빈 객체입니다.
  2. 새로 생성된 객체의 [[Prototype]] 내부 슬롯을 proto로 설정합니다. 이로써 새로운 객체는 proto 객체를 상속받게 됩니다.
  3. propertiesObject가 제공된 경우, 이 객체에 정의된 속성을 새로 생성된 객체에 추가합니다. propertiesObject는 속성 이름을 키로 가지고 해당 속성의 설정을 값으로 가지는 객체입니다. 각 속성은 Object.defineProperty를 사용하여 정의됩니다.
  4. 생성된 객체를 반환합니다.

다음은 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라는 추상 연산을 사용하여 설명하겠습니다.

ObjectOrdinaryCreateproto를 프로토타입으로 가지는 빈 객체를 생성하는 추상 연산입니다. Object.create(proto)는 실제로 ObjectOrdinaryCreate(proto, %Object.prototype%)와 동일합니다. 이제 ObjectOrdinaryCreate의 내부 동작을 살펴보겠습니다.

  1. 새로운 빈 객체를 생성합니다. 이 객체를 obj라고 합시다.
  2. obj[[Prototype]] 내부 슬롯을 proto로 설정합니다. 이로써 objproto 객체를 상속받게 됩니다.
  3. obj를 반환합니다.

이제 Object.create 메서드의 내부 동작과 ObjectOrdinaryCreate 추상 연산을 연관지어 설명해보겠습니다.

const obj = Object.create(proto);
  1. Object.create(proto)가 호출됩니다.
  2. ObjectOrdinaryCreate(proto, %Object.prototype%)가 호출됩니다.
  3. ObjectOrdinaryCreate의 내부 동작에 따라 새로운 빈 객체 obj가 생성됩니다.
  4. obj[[Prototype]] 내부 슬롯이 proto로 설정됩니다. 이로써 objproto 객체를 상속받게 됩니다.
  5. obj를 반환합니다.

즉, Object.create(proto)ObjectOrdinaryCreate 추상 연산을 호출하여 proto를 프로토타입으로 가지는 새로운 빈 객체를 생성하고 반환합니다.

추가로, ObjectOrdinaryCreateObject.prototype을 기준으로 프로토타입 체인을 형성합니다. proto 객체가 null인 경우, obj는 프로토타입이 없는 객체가 됩니다. proto 객체가 Object.prototype인 경우, objObject.prototype의 모든 메서드와 속성을 상속받는 객체가 됩니다. 따라서 objObject.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를 사용하여 객체를 생성하면서 원하는 프로토타입을 명시적으로 설정할 수 있습니다. 이를 통해 프로토타입 기반의 상속과 객체 구조를 유연하게 구성할 수 있습니다.

0개의 댓글