내부분

boyeonJ·2023년 7월 18일
0

JavaScript Basic

목록 보기
23/24

프로토타입의 생성 시점

프로토타입과 생성자 함수는 한 쌍이기 때문에, 생성자 함수가 생성되는 그 시점에 프로토타입도 생성됩니다. 그런데 여기서 생성자 함수가 생서되는 시점은 사용자 정의 생성자 함수, 빌트인 생성자 함수가 다르기 때문에 프로토타입 역시 다른 시점에 생성됩니다.

1. 사용자 정의 생성자 함수

  • 생성자 함수를 정의한(정의되어 평가)되는 시점에 프로퍼티 생성(prototype이라는 property에 바인딩) => 런타임전
  • 생성된 prototype은 오직 contructor만 property로 가진다.
  • prototype도 객체이므로 prototype의 프로토타입을 가진다(Object.prototype)

2. 빌트인 생성자 함수

  • 빌트인 생성자 함수는 전역 객체가 생성되는 시점에 생성된다.

    전역객체는 코드가 실행되기 이전에 자바스크립트 엔진에 의해 성성되는 특수한 객체


객체 생성 방식과 프로토타입의 결정

객체가 평가될때 OrdinaryObjectCreate(추상 연산)을 호출하여 객체를 생성합니다.

OrdinaryObjectCreate는 필수적으로 자신이 생성할 객체(인스턴스)의 프로토타입을 인수로 전달 받습니다.
또한, 옵션적으로 생성할 객체(인스턴스) 추가할 프로퍼티 목록도 인수로서 전달할 수 있습니다.

순서를 살펴보면 다음과 같습니다.

  1. 빈 객체를 생성한다.
  2. 만약 추가할 추가할 프로퍼티목록이 인수로 전달된 경우 프로퍼티를 객체에 추가한다.
  3. 그리고 필수로 전달받은 프로토타입을 자신이 생성한 객체의 [[Prototype]] 내부슬롯에 할당한다.
  4. 객체를 반환한다.

1. 리터럴 방식

리터럴 방식으로 생성된 객체는 OrdinaryObjectCreate에 Object.prototype이 전달됩니다.

2. Object 생성자 함수

Object 생성자 함수 방식으로 생성된 객체 역시 OrdinaryObjectCreate에 Object.prototype이 전달됩니다.

이 둘의 차이는 프로퍼티 추가하는 방식에 있다.
1. 리터럴: 내부에서 추가
2. Object 생성자 함수: 일단 빈객체 생성후 추가

3. 사용자 정의 생성자 함수

사용자 정의 생성자 함수 방식으로 생성된 객체 역시 OrdinaryObjectCreate에 생성자 함수의 prototype 프로퍼티에 바인딩 되어 있는 객체가 전달됩니다.

0개의 댓글