어제 toString()함수를 알아보다가 toString에 대한 mdn문서 제목이 Object.prototype.toString()인 것을 발견했다. 왜 toString()만 적어놓은 것이 아닐까? 이런식의 표기는 자바에서 import할 때를 생각나게 했다. 이것또한 함수를 호출하기 위한 경로인 것일까? 과연 Object.prototype.toString()이 의미하는 것이 무엇인지 알아보도록 하자.
prototype은 사전적으로 '원형'이라는 의미를 가지고 있다. prototype은 객체의 숨겨진 링크이다.
여기 비슷한 Object를 여러개 찍어내는 '복사기'라는 의미의 기능을 function을 이용해 하나 만들어보자.
function 복사기(){
this.a = 'apple';
this.b = 'banana';
}
그리고 이 복사기라는 기능을 호출하면 그 안에 복사기에 저장된 것들이 만들어진다.
아래와 같이 변수에 저장도 가능하다.
let val = new 복사기();
이제 val에서는 복사기 안에 있는 객체들을 모두 사용할 수 있다.
여기서 부모는 복사기이고 자식은 val이다 자식은 부모의 모든 것을 상속받으면서 사용할 수 있다.
자식에게 부모의 데이터를 물려주는 방법에는 이 뿐만 아니라 우리가 오늘 배우고자 하는 prototype을 이용해서도 가능하다.
아까 이야기한 사전적 의미는 '원형'이라고 한다. 하지만 내가 본 영상에서는 '유전자'라고 단어를 대체했다. 나도 이것이 더 적합하다고 생각해서 해당단어를 인용해서 글을 작성하겠다.
prototype은 수정이 자유롭다. 다음과 같은 방법으로 수정을 해서 무언가를 추가를 하면 그 자식들이 모두 사용할 수가 있다. 부모에 추가된 것을 모두가 물려받고 사용할 수 있다니 이것때문에 나도 유전자라는 단어가 더 적합하다고 생각하는 것이다.
prototype에 무언가를 추가할 때는 object에서 key로 접근하는것처럼 점 표기법으로 접근해서 사용한다.
function 복사기(){
this.a = 'apple';
this.b = 'banana';
}
//이런식으로 객체 추가가 가능하고
복사기.prototype.c = "cola"
//이런식으로 function도 추가할 수 있다.
복사기.tprototype.type = function(){}
우리가 함수를 쓸 때를 생각해보자. split(), splice(), sort() ...등등 다양한 함수를 쓸 때 우리가 그 함수들을 어떻게 사용할 수 있는지 생각해 보았는가? 바로 이와같은 prototype에 추가되어있기 때문에 호출해서 사용할 수 있는 것이다.

해당사진은 console에서 Array.prototype을 찍은 것이다. 우리가 지금까지 잘 사용해왔던 함수들이 이 안에 저장된 것들을 확인 할 수 있다.
결론적으로 Object.prototype.toString()이 의미하는 것은 Object의 자식들은 모두 사용할 수 있는 함수를 이야기하는 것이었다. Object는 최상위 객체이다. 우리가 toString()을 호출하면 먼저 그 호출한 객체에 그런 함수가 있는지를 확인한다. 없다면 부모로 올라간다. 또 부모로 올라간다. 그런식으로 결국에 찾게 된다면 그 부모에 새겨져 있는 toString()을 사용하는 것이다.
내가 처음에 생각한 자바의 import와 좀 비슷한것 같다는 생각이 들지만 또 다른 자바스크립트만의 기능이었다.