Javascript 와 Prototype 프로토 타입
자바스크립트를 처음부터 다시 공부해보려고 한다.
Javascript 는 prototype 언어 라고 해도 과언이 아니다.
프로토타입 기반 프로그래밍은 객체지향 프로그래밍의 한 형태로 클래스가 없고, 클래스 기반 언어에서 상속을 사용하는 것과는 다르게, 객체를 원형(프로토타입)으로 하여 복제의 과정을 통하여 객체의 동작 방식을 다시 사용할 수 있다.
프로토타입기반 프로그래밍은 클래스리스(class-less), 프로토타입 지향(prototype-oriented) 혹은 인스턴스 기반(instance-based) 프로그래밍이라고도 한다.
by wiki
Javascript 의 모든 객체는 자신의 부모를 가리키는 참조 링크인 [[Prototype]] 가 존재한다.
객체의 [[Prototype]] 은 부모의 prototype 객체를 바라보며, 이것이 반복(체인) 되다가, prototype 으로 null 을 가지고 있는 객체에서 끝이 난다.
prototype 객체
Javascript의 모든 객체는 자신의 prototype 으로 부터 constructor 프로퍼티를 상속한다.
객체 인스턴스가 생성되는 순간 prototype 의 constructor 생성자 메서드를 호출한다.
또한 모든 JavaScript 함수는 Function prototype 객체을 참조하기 때문에 Function prototype 객체의 constructor을 호출하여 생성한다.
prototype 객체는 constructor 호출과 함께 생성된다.
prototype 프로퍼티와 [[Prototype]] 링크의 차이
Javascript의 객체는 prototype 프로퍼티 와 숨어있는 [[Prototype]] 링크 프로퍼티를 가지고 있다.
prototype 프로퍼티는 객체의 prototype 객체를 가르킨다.
[[Prototype]] 링크는 생성자 함수의 prototype 프로퍼티가 가리키는 prototype 객체를 가르킨다.
Chrome 에서 __proto__ 프로퍼티는 [[Prototype]] 링크를 가르킨다.
String, Number, Boolean 프로토타입
순수 원시값 ( [[PrimitiveValue]] ) 은 prototype 이 존재하지는다.
하지만 원시값을 읽을 때 래퍼 타입이 생성되어, 해당 객체의 prototype 을 사용할 수 있다.
원시값을 호출시 래퍼 타입 객체를 생성하고 읽은 후에는 래퍼 타입 객체를 제거한다.
new 연산자를 이용해 참조타입으로 생성하면, 제거하지 않고 계속 유지한다.
프로토타입 체이닝
Javascript 에서 객체의 프로퍼티 나 메서드 에 접근하려고 할때, 객체에 존재 하지 않는다면, [[Prototype]] 링크를 따라 차례대로 부모 prototype 객체를 검색하며, 종료 prototype 객체까지 없을때는 undefined 를 반환한다.
거의 모든 객체는 Object.prototype 을 상속하기 때문에, Object.prototype 에 추가되어 있는 메서드를 사용할 수 있다.
Object.prototype
JavaScript 에서 거의 모든 객체는 Object의 인스턴스이다.
객체는 Object.prototype 에서 속성과 메서드를 상속받는다.
만약 프로토타입을 초기화 하고 싶다면, Object.create 와 Object.setPrototypeOf 메서드를 이용하여 프로토타입을 초기화 하거나 변경 할 수 있다.
class
ES6 부터 class 문법을 지원한다.
class 는 새로운 타입이 아니며, 그 내부는 함수이다.
class 의 prototype 은 생성자 class 의 prototype 객체이다.
때문에 생성자 prototype의 메서드를 override 하면, override 한 메서드가 실행된다.
extends 로 상속받는 부모 객체는 prototype chaining 으로 메서드를 참조할 수 있다.