해결된 질문
작성
·
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
에 접근하여 값을 도출합니다.