Self라는 언어가 프로토타입를 클래스 대신 사용한 첫 언어이다.
extends
를 이용해서 상속하는 클래스보다 조금 더 가볍다는 장점이 있다.
자바스크립트도 이 prototype을 사용함
const new_object = Object.create(old_object);
다음과 같이 객체를 생성할 때, old_object
는 new_object
의 프로토타입이 된다.
원래대로라면, 객체에 없는 property에 접근하면 undefined
가 반환되지만,
만약 객체에 프로토타입이 있다면, 그 프로토타입 property에서 그 값을 찾고,
없다면 그 프로토타입의 프로토타입을 가는 식으로 계속 탐색하게 된다.
많은 객체가 프로토타입을 공유할 수 있지만, 이는 클래스와 인스턴스와 같은게 아니라
그냥 어쩌다 같은 프로토타입을 갖고 있는 별개의 객체일 뿐이다.
프로토타입은 메소드를 저장할 때 가장 많이 쓰이는데.
비슷한 객체들은 비슷한 메소드를 갖고 있는 것이 좋기 때문에
모든 객채에 이런 메소드를 주기 보다는, 하나의 프로토타입에 이를 저장하고
그 프로토타입을 공유하는 것이 바람직하다.
그럼 그 프로토타입에 있는 함수는 자기가 어떤 객체에 있는지 어떻게 알지?
바로 this를 통해서 알 수 있다.
this가 바인딩 되는 방식은 다음과 같다.
메소드 호출 시, 해당 객체에서 메소드를 찾게 되고
만약 메소드가 발견되면 인수와 this를 갖은채로 함수가 불러지게 된다.
그렇다면 메소드 안에 함수가 있을 땐 왜 this의 접근이 불가능한걸까?
그 이유는, 그 안의 함수는 메소드 호출이 아니기 때문이다.
this 바인딩은 오직 메소드 호출만이 가능하다.
new_object.bud(); // succeds
const funky = new_object.bud;
funky(); // fail
또한, this는 동적 바인딩이다.
즉, 함수의 생성이 아닌, 함수의 호출이 this의 바인딩을 결정한다는 것이다.
그런데 저자는 this를 아예 쓰지 않고도 프로그래밍을 할 수 있으며,
심지어 this의 제거가 더 컴팩트하고 좋은 프로그램을 가져온다는 것을 깨달았다고 함
그래서 this를 쓰지 않고 프로그래밍 하는 법을 익히는 걸 추천함
class를 쓰는 건 멍청하고
this를 쓰는 건 좋지 않다.