객체 지향 프로그래밍 1-3) 프로토타입과 클래스
자바 스크립트는 프로토타입 기반 언어다. (사실 이 개념에 관련된 포스팅으로 아주 좋은 국내 자료가 있어서 하단 첨부했으니 일회독 이상을 권한다. 자바 스크립트 언어의 기원과 깊은 관련이 있다.)
어쨌거나 자바 스크립트는 '프로토타입 Prototype' 이라는 이름을 가진 슬롯을 통해 객체를 상속한다. 이는 JS에 존재하는 모든 객체들이 속성과 메소드를 상속받기 위한 수단으로 '프로토타입 객체'를 택한다는 뜻이다. 좀더 풀어 말하자면 '프로토타입'이라는 속성에는, 자식에게 상속되는 요소들이 정의되어 있다.
모든 객체는 프로토타입을 갖고 있으며, 모든 프로토타입은 '생성자 함수'와 연결되어 있다. prototype도 하나의 객체이며 '프로토타입 체인'을 통해 상속하고자 하는 속성과 메소드를 담아두는 버킷으로 주로 사용된다.
프로토타입prototype를 쓰면 자식에게 데이터를 물려줄 수 있다.
클래스를 처음 생성할 때 .prototype라는 이름으로 자동으로 함께 비밀 공간이 생성된다. 여기서 prototype란 일종의... 유전자라고 볼 수 있다(feat 코딩애플).
기계라고 정의된 클래스의 prototype에 뭔가를 추가한다고 쳐보자.
기계.prototype.name = "kim";
이런 식으로 추가하게 된다. 이제 클래스 기계에서 파생된 자식들이, 이렇게 프로토타입에 추가한 것을 갖다 쓸 수 있다. nunu가 파생된 자식이라고 쳤을 때 nunu.name //결과가 "kim"
즉 nunu 내부에 콘솔을 찍어보면 name이 존재하지 않지만, .name을 써서 불러온다면 "kim"이라는 프로토타입에 있는 결과가 나온다. 어떻게 이게 가능할까?
부모 클래스 내부에 원하는 기능을 추가해두면 이 기능들은 자식들이 직접 상속받아 가지고 간다. 이 경우에는 자식 내부에도 동일한 기능들이 들어온다. 그러나 부모 클래스 내부가 아니라 그 유전자인 prototype에 위와 같이 추가하면? -> 부모 클래스만 내부에 name: "kim"을 가지되, 자식이 이것을 프로토타입으로부터 끌어다 쓸 수 있다.
즉! object에서 자료를 뽑을 때 어떤 과정으로 찾는지 흐름을 잘 숙지하는 게 중요하다. 자식인 nunu가 직접 name을 갖고 있을 시 바로 뽑을 수 있다. 그러나 자식 내부에 없을 시, 그 부모 유전자(프로토타입)을 뒤진다. 거기에 존재하면 출력. 없을 시에는 부모의 부모 유전자까지 계속해서 물어보며 타고 올라간다(이것을 프로토타입 체인prototype chain이라고 부른다).
따라서 부모의 유전자, 즉 프로토타입에만 원하는 것을 기록해놔도 자식은 그것을 갖다 쓸 수 있게 된다. ...
근데 솔직히 프로토타입을 바로 이해하기는 불가능 아닌가? 좀더 음미하고 파봐야겠다. 후에 추가 수정할 것.
- 프로토타입
- .prototype
- .__proto__
- 클래스, 인스턴스, 프로토타입의 관계
참고: MDN
https://developer.mozilla.org/ko/docs/Learn/JavaScript/Objects/Object_prototypes
Object prototypes - Web 개발 학습하기 | MDN
Javascript에서는 객체를 상속하기 위하여 프로토타입이라는 방식을 사용합니다. 본 문서에서는 프로토타입 체인이 동작하는 방식을 설명하고 이미 존재하는 생성자에 메소드를 추가하기 위해 프
developer.mozilla.org
자바스크립트는 왜 프로토타입을 선택했을까
프로토타입으로 검색하면 으레 나오는 서두처럼 저 또한 자바스크립트를 처음 접했을 때 가장 당황스러웠던 게 프로토타입이었습니다.
medium.com