자바스크립트는 멀티 패러다임 프로그래밍 언어이다. 오늘은 그중에서 프로토타입 기반에 대해 공부해본다. 자바스크립트는 다른 클래스 기반 객체지향 프로그래밍 언어의 특징인 클래스와 상속, 캡슐화를 위한 키워드가 없어서 오해를 받아왔다. 하지만 자바스크립트는 클래스 기반 객체지향 프로그래밍 언어보다 효율적이고 더 강력한 객체지향 프로그래밍을 지닌 프로토타입 기반의 객체지향 프로그래밍 언어이다.
전에도 언급했듯이 자바스크립트는 원시타입의 값을 제외한 모든 값들이 객체로 이루어졌다.
function Circle(radius) { this.radius = radius; } Circle.prototype.getArea = function () { return ~~~~; } //인스턴스 생성 const circle1 = new Circle(1); const circle2 = new Circle(2); // 이렇게 될시 프로토타입에 추가된 getArea메서드를 공유해서 사용한다 // 프로토타입은 Circle 생성자 함수의 prototype 프로퍼티에 바인딩된다
이처럼 프로토타입 객체는 객체 간 상속을 구현하기 위해 사용된다. 프로토타입을 상속받은 하위 객체는 상위 객체의 프로퍼티를 자신의 프로퍼티처럼 자유롭게 사용한다.
__proto__
접근자 프로퍼티모든 객체는 __proto__
접근자 프로퍼티를 통해 자신의 프로토타입, 즉 [[Prototype]] 내부 슬롯에 간접적으로 접근할 수 있다.
브라우저 콘솔창에 객체를 적으면 __proto__
접근자 프로퍼티를 통해 내부슬롯을 확인할 수 있다.
내부슬롯은 해당 객체의 프로퍼티가 아니다. 그러므로 __proto__
접근자 프로퍼티를 통해 간접적으로 접근하는 것이다.
프로토 접근자 프로퍼티는 객체가 직접 소유하는 프로퍼티가 아니라 Object.prototype의 프로퍼티이다. 모든 객체는 상속을 통해 Object.protytype.__proto__
접근자 프로퍼티를 사용할 수 있다.
__proto__
접근자 프로퍼티를 통해 프로톹입에 접근하는 이유
__proto__
접근자 프로퍼티를 코드 내에서 직접 사용하는 것은 권장하지 않는다.
함수 객체의 prototype 프로퍼티
리터럴 표기법에 의해 생성된 객체도 생성자 함수와 연결된다. 객체는 두 방법에 의해 생성되므로 모든 객체는 생성자 함수와 연결되어 있다.