프로토타입 기반 생성

왜 new 키워드까지도 필요한 걸까? 결국 다음과 같이 간단하게 작성할 수도 있다.

하지만 이렇게 하는 것과 완전히 같지는 않다. new는 내부적으로 하는 일이 몇 가지 더 있다. 우선 한 가지 예를 들자면 killerRabbit에는 constructor라는 프로퍼티가 있는데, 이 프로퍼티는 killerRabbit을 생성한 Rabbit 함수를 가리킨다. blackRabbit에도 그런 프로퍼티가 있지만, blackRabbit은 Object 함수를 가리킨다.

이 constructor 프로퍼티는 어디서 온 걸까? 이 프로퍼티는 토끼 프로토타입(prototype)의 일부다. 프로토타입은 강력하며, 다소 혼동되더라도 자바스크립트 객체의 동작 방식에 일부 관여한다. 모든 객체는 프로토타입을 기반으로 하며, 이런 프로토타입은 Object 생성자와 연관돼 있으며, 따라서 모든 객체에서 공유한다(그런데 {}를 입력하는 것은 new Object()를 입력하는 것에 상응한다).

toString은 Object 프로토타입의 일부를 구성하는 메소드다. 이는 모든 간단한 객체에는 toString 메서드가 있다는 뜻이며, 이 메소드는 객체를 문자열로 변환한다. 사실 모든 객체에는 toString 메소드가 있으며, 심지어 한 객체가 또 다른 프로토타입을 갖더라도 해당 프로토타입 자체는 객체이므로 Object 프로토타입에(직접적으로 간접적으로든) 기반을 둘 것이다.



생성자와 프로토타입

토끼 객체는 Rabbit 생성자와 연관된 프로토타입을 기반으로 한다. 생성자의 prototype 프로퍼티를 이용하면 이 프로토타입에 접근할 수 있다.