인프런 커뮤니티 질문&답변

yus님의 프로필 이미지
yus

작성한 질문수

코어 자바스크립트

프로토타입 (prototype)

Object.prototype.constructor의 [[prototype]] ?

해결된 질문

작성

·

557

·

수정됨

1

강의에서 설명해 주신

객체(인스턴스) 와, 그것의 생성자 함수, 그리고 객체의 프로토타입 이 3가지의 구조에 대해서는 이해했습니다.

 

그렇게 되면, 어떤 객체를 프로토타입 체인을 타고 올라가도

결국 Object.prototype 에 도달하게 되는 것이고,

Object.prototype 또한 constructor를 가지고 있을 것입니다.

 

그렇다면 그 constructor는 함수이므로,

Function.prototype 을 상속 받을 것이고,

Fuction.prototype의 constructor

역시 함수이므로 Function.prototype을 상속 받게 됩니다.

 

크롬 개발자 도구에서 객체를 선언하고 console.dir로 타고타고 올라가면 결국 저 Object.prototype.constructor 가 나오는 시점부터 무한하게 트리를 타고 올라가게 되는데

[[prototype]] > constructor > [[prototype]] > constructor > [[prototype]] ....

 

제가 보기엔 재귀참조형태 같아보이는데 이것이 맞는지 궁금하여 질문 드립니다.

 

그렇게 되면

 

Function.prototype.constuctor === Function()

Function().[[prototype]] === Function.prototype

Function.prototype.[[prototype]] === Object.prototype

Object.prototype.constructor === Object()

Object().[[prototype]] === Function.prototype

 

형태가 되어버리는데 이게 맞는 지 궁금합니다..

무언갈 놓치고 있는 것인지? 아니면 최상위 Object 객체에선 다르게 동작하는 규칙이 있는 것인지 궁금합니다.

 

답변 1

0

정재남님의 프로필 이미지
정재남
지식공유자

이건 프로토타입만 그런건 아니에요.

const obj = {}
obj.a = obj

이런 식으로 재귀참조를 걸면
console창에서는 무한히 참조가 이어지는 것으로 보이게 됩니다.

그런데 이런 식의 '무한 참조' 구조를 처음부터 만들어놓는 것은 아니에요.
사용자가 접근하려고 할 때 비로소 참조연결이 이뤄지는 식으로 동작합니다.

엔진 입장에서는 처음에는 obj = { a: obj } 로만 알고 있다가
사용자가 obj.a.a 로 접근하려고 할 때,
이를 순차적으로 쪼개어
처음에는 obj.a까지만 접근하여 값(result (obj))을 얻고,
다시 그 값으로부터 result.a에 접근하여 값을 도출합니다.

yus님의 프로필 이미지
yus

작성한 질문수

질문하기