Java, C++과 같은 클래스 기반 객체지향 프로그래밍 언어와 달리 JavaScript는 프로토타입 기반 객체지향 프로그래밍 언어(prototype based language)이다.
클래스 기반 객체지향 프로그래밍 언어는 객체 생성 이전에 클래스를 정의하고 이를 통해 객체(인스턴스)를 생성
하지만 프로토타입 기반 객체지향 프로그래밍 언어는 클래스 없이도 객체 생성 가능
객체의 원형이라고 표현(prototype을 유전자라고 표현)
함수 객체에는 Prototype이라는 특수한 유형의 객체 프로퍼티(속성)이 존재
이러한 prototype 프로퍼티를 통해 생성자 함수는 인스턴스에게 Prototype 객체에 있는 데이터, 메소드를 상속
인스턴스 객체의 key에 접근할 때, 해당 객체에게 key가 없다면 그 다음으로 상위 prototype 속성에서 key가 있는지 확인
없다면 key를 찾기 위해 더 상위의 prototype에서 찾음.
=> 이것을 prototype chain이라고 함
arr = [1, 2, 3]이라고만 만들었는데 push, pop을 사용할 수 있는 이유는??
-> 내부적으로 배열 자료형에는 위 메소드를 처리해놓음
-> Array라는 원형이 있고 arr는 Array의 자식이고 Array에게 상속 받음
-> Array 안에 prototype 객체 안에 push, pop 존재
> Array.prototype.name = '어레이';
< '어레이'
> const arr = [1,2,3];
< undefined
> arr.name;
< '어레이'