inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

자바스크립트 비기너: 튼튼한 기본 만들기

5. 함수 호출 구조, __proto__ 구조

이해가 안돼서 3번보고 정리해봤습니다. 제 노트 공유해봅니다

311

sellermax
2

여기 파트에서 막힐뻔 했지만 선생님 말을 한마디씩 재생 정지 반복하면서 보니까 명쾌했음. 

왜 빌트인String에 toString() 이 존재할까?

빌트인Number에만 toString()이 있어야 정상아닌가?

1. 일단 일반적인 인스턴스를 만들 때를 보면 인스턴스가 빌트인오브젝트에 있는 prototype하위 레벨들을  __proto__에 상속을 받는다. (length파트에서도 설명함)

2. new String으로 받는 인스턴스를 전개해보면 __proto__ 가 나오는데 거기에 toString()이 존재한다. 

근데 스크롤을 내리다보면  __proto__ 가 한 개 더있다

근데 거기에도 toString()이 존재한다.

3. 인스턴스에 __proto__ . __proto__ 가 있는데 첫번째 프로토는 빌트인 스트링이고, 두번째 프로토는 빌트인 오브젝트이다.

첫번째 프로토에 내가 호출하려는게 없다면 JS는 두번째 프로토를 들어가서 찾는다. 근데 두번째 프로토에도 없다? 에러난다. 또 함수가 아니라 프로퍼티면 undefined 반환

즉 자바스크립트는 계층적으로 내려가면서 호출하려는 함수를 찾는 구조를 갖는것이다.

그렇다면 만약에 String오브젝트에 toString()이 없다고 가정해보자.

Object 오브젝트에 toSring()이 호출될것이다. (두번째__proto__에 있는 toString())

근데 빌트인 오브젝트는 {key:value}형태이다. 그러면 toString()도  {key:value}에 맞춰서 문자열로 바꿀텐데 거기에String을 넣어버리면 이상한 모습이 된다. 이상한 모습을 더 자세히 말하자면  {key:value} 형태를 문자열로 바꿔야하는데 value만 작성하는게 아니라 온전하게 {key:value}로 작성해야해서 이상해진다는 것이다.

그렇게 되지 않게하려고 첫번째 __proto__즉, 빌트인 스트링에 toString() 함수를 넣어준것이다. {key:value}형태의 이상한 모습이 되지 않게 하려고 일부러 넣어준것이라 볼 수 있겠다.

빌트인 Number도 똑같은 맥락이다. 인스턴스 첫번째 프로토에 toString()이 없으면 두번째 프로토인 빌트인오브젝트로 계층이 이동하여 {key:value}형태로 만들어져 모습이 이상해진다.

__proto__: toString(), __proto__: toString()

그래서 대부분 빌트인 옵젝에 toString()과 valueOf()가 있다. 

이해가 안되면 length프로퍼티 강의가서 한 번 더보기

답변 1

0

김영보

맞습니다.^^