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

boutime2017님의 프로필 이미지
boutime2017

작성한 질문수

코어 자바스크립트

코어 자바스크립트 질문입니다!

해결된 질문

작성

·

170

0

165페이지 '프로토타입 체이닝'에 관한 질문입니다.

var arr = [1, 2];

Array.prototye.toString.call(arr);

Array의 프로토타입에는 toString이라는 메서드가 없으니 프로토타입 체이닝으로 거슬러 올라가서 Object의 프로토타입에 있는 toString메서드를 참조한다는 것은 알겠습니다. 

call로 arr를 this바인딩 해주었으니 출력 결과도 '1, 2'가 나오는 것도 이해가 됩니다.

그런데

Object.prototype.toString.call(arr);의 출력 결과가 [object Array]가 나오는 것은 왜인가요?

똑같이 Object의 프로토타입에 정의된 메서드를 호출한 것이고, this바인딩도 같은 값을 참조하는데 무엇이 다른 것인지 모르겠습니다.

(메서드의 호출 주체가 서로 다르다 할지라도, call로 this바인딩을 동일하게 묶어주었으면 다를 것이 없지 않나요?)

또, 저는 교재의 설명상 원래 다른 생성자에는 toString메서드가 없고, 오직 Object.prototype에만 toString메서드가 있는 것으로 이해했습니다.

다른 생성자로 생성된 인스턴스들이 toString메서드를 참조할 수 있는 것은 프로토타입 체이닝을 통해 호출하는 것이고요.

그런데, mdn에서 toString을 검색해보면 다른 생성자 함수의 프로토타입에도 toString이 정의되어 있는 것처럼 보입니다.

개발자 도구에서 로그를 찍어봐도 아래와 같이 나오고요.

책 출판 시점에서 그새 무언가 바뀌었는가 싶다가도, 어쨌거나 Object.prototype.toString.call(arr);의 출력 결과가 [object Array]인 것에 대해서는 이해가 잘 안됩니다.

mdn의 설명에 따르면,  커스텀 객체에서 toString메서드를 호출하면 Object로부터 상속받은 기본 값을 반환하게 된다고 설명되어 있는데, 애초에 자바스크립트에는 '상속'의 개념은 없지 않나요?

질문이 중구난방이라 죄송합니다 ㅠ

답변 2

1

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

165페이지 밑에서 6번째줄에서 'toString이라는 이름을 가진 메서드는 Array.prototype뿐 아니라 Object.prototype에도 있습니다.' 라고 설명했습니다. 이 말은, toString 메소드가 Object.prototype에도 있고 Array.prototype에도 있다는 뜻입니다.

Array.prototype.toString 메소드는 배열에 적용시 각 배열 요소들을 콤마로 병합(join)한 문자열을 반환합니다.

Object.prototype.toString 메소드는 참조형 데이터에 적용시, 'object [type]' 이라는 문자열을 반환합니다. 여기서 type은 해당 데이터의 데이터타입 이름을 의미합니다.

[1, 2].toString()

은 Array.prototype.toString을 [1, 2]에 적용한 것이고,

Array.prototype.toString.call([1, 2])

역시 Array.prototype.toString을 [1, 2]에 적용한 것인 반면,

Object.prototype.toString.call([1, 2])

은 Object.prototype.toString을 [1, 2]에 적용한 것입니다.

'상속'개념은 책의 '클래스' 파트 전반에 걸쳐 설명하고 있습니다.

책 출판 시점에 바뀐 것은 없습니다.

0

boutime2017님의 프로필 이미지
boutime2017
질문자

죄송합니다 ㅠ 논리를 따라가지 못하다 보니 책에 설명되어 있는 부분도 놓쳤네요 

boutime2017님의 프로필 이미지
boutime2017

작성한 질문수

질문하기