여기 파트에서 막힐뻔 했지만 선생님 말을 한마디씩 재생 정지 반복하면서 보니까 명쾌했음.
왜 빌트인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프로퍼티 강의가서 한 번 더보기
맞습니다.^^
답글