하나의 모델이 되는 청사진(blueprint)을 만들고 -> class
그것을 바탕으로 한 객체(object)를 만드는 -> instance
프로그래밍 패턴.
프로그램 설계 철학 중 하나.
OOP의 모든 것은 "객체"로 그룹화된다.
4가지 주요개념을 통해 재사용성을 얻을 수 있음.
extends
와 super
를 이용해서 상속을 구현할 수 있음.클래스를 만들 때 일반적인 함수를 정의하듯 만드는데, 그냥 실행하는 것이 아닌 new
키워드를 써서 만듬. + 암묵적인 규칙으로 대문자, 일반명사로 이름을 만듬
ES6 문법
class Car{
constructor(brand, name, color){
// 인스턴스가 만들어질 때 실행되는 코드
}
refuel(){
}
drive(){
}
}
this
-> 함수가 실행될 때, 해당 스코프마다 생성되는 고유한 실행 컨텍스트(excution context), new
키워드로 인스턴스를 생성했을 때, 해당 인스턴스가 바로 this
의 값이 됨.prototype
-> 모델의 청사진을 만들 때 쓰는 원형 객체(original form)constructor
-> 인스턴스가 초기화될 때 실행하는 생성자 함수
- 어떤 생성자 함수(Constructor)를 new 연산자와 함께 호출
- Constructor에서 정의된 내용을 바탕으로 새로운 인스턴스 생성.
- 이때 인스턴스에는
__proto__
라는 프로퍼티가 자동으로 부여됨. (__proto__
는 생략이 가능)- 이 프로퍼티는 Constructor의 prototype이라는 프로퍼티를 참조.
__proto__
는 생략이 가능하기 때문에, 생성자 함수의 prototype에 어떤 메서드나 프로퍼티가 있다면, 인스턴스에서도 마치 자신의 것처럼 해당 메서드나 프로퍼티에 접근이 가능하다.
new
연산자와 함께 호출해서 인스턴스를 생성하든, 그냥 배열 리터럴을 생성하든, 인스턴스가 만들어 짐.__proto__
는 Array.prototype
을 참조 -> __proto__
는 생략이 가능하기 때문에, push
나 pop
같은 메서드를 마치 자신의 것처럼 호출할 수 있음.Array
의 prototype
프로퍼티 내부에 있지 않은 from
이나 isArray
등의 메서드들은 인스턴스가 직접 호출할 수 없다. -> Array
생성자 함수에서 직접 접근해야 사용이 가능하다.prototype
객체 내부에는 constructor
라는 프로퍼티가 있는데, 이 프로퍼티는 단어 그대로 원래의 생성자 함수(자기 자신)을 참조한다.
__proto__
방향을 계속 찾아가는 과정.
이 프로토타입 체이닝을 통해 각 프로토타입 메서드들을 자신의 것처럼 호출할 수 있음.
접근 방식은 자신으로부터 가장 가까운 대상으로부터 점차 먼 대상으로 나아가며, 원하는 값을 찾으면 검색을 중단함.
__proto__
를 검색하는 순서로 진행됨.Object.prototype
이 될 것임.let arr = [1,2];
arr.__proto__ // Array
arr.__proto__.__proto__ // Object, 최상단
Object.prototype
에는 모든 데이터 타입에서 사용할 수 있는 범용적인 메서드만이 존재.Object.prototype
가 아닌 Object
생성자 함수에 static하게 담겨있다.