Javascript 와 Prototype 프로토 타입

박성룡 ( Andrew park )
4 min readMay 8, 2019

--

자바스크립트를 처음부터 다시 공부해보려고 한다.

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 으로 메서드를 참조할 수 있다.

--

--

박성룡 ( Andrew park )
박성룡 ( Andrew park )

Written by 박성룡 ( Andrew park )

Javascript is great We may not be great

No responses yet