객체 지향 프로그래밍이란?
전통적인 명령형 프로그래밍의 절차지향적 관점에서 벗어나
여러 개의 독립적 단위, 객체의 집합으로 프로그램을 표현하려는 프로그래밍 패러다임.
실체는 속성을 가지고 있고, 필요한 속성을 간추려 내어 표현하는 것을 추상화(abstraction)라 한다.
객체란?
속성을 통해 여러 개의 값을 하나의 단위로 구성한 복합적인 자료구조, 상태 데이터와 동작을 하나의 논리적인 단위로 묶은 복합적인 자료구조.
상태 데이터를 프로퍼티(property), 동작을 메서드(method)라 한다.
자신의 고유한 기능을 수행하면서 다른 객체와 관계성을 가질 수 있다.
// 생성자 함수
function Circle(radius) {
this.radius = radius;
// Circle 생성자 함수가 생성한 모든 인스턴스가 getArea 메서드를
// 공유해서 사용할 수 있도록 프로토타입에 추가
// 프로토타입은 Circle 생성자 함수의 prototype 프로퍼티에 바인딩되어있다.
Circle.prototype.getArea = function() {
return Math.PI * this.radius ** 2;
};
// 인스턴스 생성
const circle1 = new Circle(1);
const circle2 = new Circle(2);
// Circle 생성자 함수가 생성한 모든 인스턴스는 부모 객체의 역할을 하는
// 프로토타입 Circle.prototype으로부터 getArea 메서드를 상속받는다.
// 즉, Circle 생성자 함수가 생성하는 모든 인스턴스는 하나의 getArea 메서드를 공유한다.
console.log(circle1.getArea === circle2.getArea); // true
줄여서 프로토타입이라 한다.
객체 간 상속을 구현하기 위해 사용한다.
모든 객체는 [[prototype]] 내부 슬롯을 가지며, 이 내부 슬롯의 값은 프로토타입의 참조다.
객체가 생성될 때 객체 생성 방식에 따라 프로토타입이 결정되고 [[prototype]]에 저장된다.
객체와 프로토타입과 생성자 함수는 서로 연결되어 있다.
const obj = {};
const parent = { x: 1};
// getter 함수인 get __proto__가 호출되어 obj 객체의 프로토타입을 취득
obj.__proto__;
// setter 함수인 set __proto__가 호출되어 obj 객체의 프로토타입을 교체
obj.__proto__ = parent;
console.log(obj.x); // 1
Object.getPrototypeOf
, Object.setPrototypeOf
메서드를 사용을 권장한다.구분 | 소유 | 값 | 사용 주체 | 사용 목적 |
---|---|---|---|---|
proto 접근자 프로퍼티 | 모든 객체 | 프로토타입의 참조 | 모든 객체 | 객체가 자신의 프로토타입에 접근 또는 교체하기 위해 사용 |
prototype 프로퍼티 | constructor | 프로토타입의 참조 | 생성자 함수 | 생성자 함수가 자신이 생성할 객체(인스턴스)의 프로토타입을 할당하기 위해 사용 |
프로토타입은 생성자 함수가 생성되는 시점에 더불어 생성된다.
Object
, String
, Number
, Function
, Array
, RegExp
, Date
, Promise
등과 같은 빌트인 생성자 함수도 일반 함수와 마찬가지로 생성자 함수가 생성되는 시점에 프로토타입이 생성된다.이들은 모두 추상 연산 OrdinaryObjectCreate에 의해 생성된다는 공통점을 가진다.
프로토타입은 추상 연산 OrdinaryObjectCreate에 전달되는 인수에 의해 결정된다. 이 인수는 객체가 생성되는 시점에 객체 생성 방식에 의해 결정된다.