자바스크립트 언어

자바스크립트는 명령형, 함수형, 프로토타입 기반 객체지향 프로그래밍을 지원하는 멀티 패러다임 언어이다. 객체지향이라면 생각나는 Java처럼 Class가 있긴 하지만 protected, private등은 자바스크립트를 쓰면서 들어본 적이 없다. 자바스크립트로 어떻게 객체지향 프로그래밍을 할까?

객체지향 객체(데이터[속성 혹은 상태]와 데이터를 조작하는 동작을 하나의 단위로 묶은 복합적인 자료구조)의 집합으로 프로그램을 표현하려는 패러다임이다. 더 알아보기

프로토타입

프로토타입은 자바스크립트에서 객체지향 프로그래밍의 상속을 구현할 수 있게 만들어준다. 어떻게 상속을 구현할까?

생성자 함수를 new 연산자랑 함께 호출하면 인스턴스가 나오는데 인스턴스에는 __prototype__이라는 객체가 생긴다.

const newObj = new NewObj()

이 객체는 생성자 함수가 가지고 있는 Prototype 이라는 객체를 참조한다. 이 참조 객체는 불필요한 코드 중복을 없애주는 중요한 객체이다.

모든 객체는 __prototype__접근자 프로퍼티를 통해 자신의 프로토타입, 즉 [[Prototype]]의 내부 슬롯에 간접적으로 접근할 수 있는데 이는 생략이 가능하다.

[[Prototype]]를 통해서 set이나 get메서드를 사용할 수 있다. 하지만 직접적으로 접근할 수 없고, 접근자 프로퍼티를 이용해서 접근할 수 있는다.
이유는 서로 참조하여 오류가 나는 것을 방지하기 위함이다. 단방향 링크드 리스트로 구현해야 오류가 나지 않는다. 서로가 서로를 참조하면 아무 의미가 없지 않겠나?

프로토타입에는 종점이 없다. 그래서 무한루프에 빠질 수 있으니 한 방향으로 흘러가야 하는 것을 기억하자.

__prototype__는 코드 내에서 직접 사용하는 것은 권장하지 않는다. 모든 객체가 __prototype__에 접근할 수 있는 것은 아닌데 직접상속으로 만들어진 객체가 그러하다. 그렇다면 어떻게 사용할 수 있을까? Object.getPrototypeOf() 메서드를 사용하면 가능하다.

function Proto(obj) {
  this.obj = obj
}

var foo = new Proto({ a: 1 });

console.dir(Proto); // prototype 프로퍼티 O
console.dir(foo); // prototype 프로퍼티 X

함수 객체가 소유하는 prototype 프로퍼티는 생성자 함수가 생성할 인스턴스의 프로토타입을 가리킨다.

reference