Javascript는 원래 프로토타입을 기반으로 하지만, ES6 이후 클래스를 기반으로 한 객체 지향 프로그래밍이 가능해졌다.
function Car(brand, name, color){
this.brand = brand;
this.name = name;
this.color = color;
}
Car.prototype.refuel = function(){
}
Car.prototype.drive = function(){
}
class Car {
constructor(brand, name, color){
this.brand = brand;
this.name = name;
this.color = color;
refuel(){
}
drive(){
}
}
}
constructor
함수: 세부 사항(속성)이 들어감. 인스턴스가 만들어질 때 실행되는 코드super
부모 클래스의 함수를 호출할 때 사용super
키워드 하나만 사용되어야 함this
키워드가 사용되기 전에 호출되어야 함instance object
, 줄여서 인스턴스instance
라고 함new
키워드 사용this
는 인스턴스 객체를 의미(해당 인스턴스가 바로 this의 값이 됨)prototype
)에 정의되어 있기 때문인스턴스.__proto__
=== 클래스.prototype
인스턴스.__proto__.__proto__
=== 상속받은 클래스의 부모 클래스.prototype
인스턴스.__proto__.__proto__.__proto__
=== Object.prototype
객체 지향 프로그래밍은 절차 지향 프로그래밍과는 다르게 데이터와 기능을 한곳에 묶어서 처리한다. Java나 C+, C# 등 현대 언어 대부분은 객체 지향의 특징을 가지고 있다. 하지만 Javascript는 엄밀하게 객체 지향 언어는 아니지만, 객체 지향 패턴으로 작성이 가능하다.
객체 지향의 주요 개념(캡슐화, 추상화, 상속, 다형성)을 통해 재사용성을 높일 수 있다.
private
키워드를 지원하는 브라우저가 적어 널리 쓰이지 않지만, 은닉화를 돕기 위해 클로저 모듈 패턴 사용 → ES2019부터 클래스, 인스턴스 형태로 만들 때 #
키워드가 도입됨base class
) 특징을 자식 클래스(파생 클래스 derived class
)가 물려받음interface
기능 존재하지 않음Javascript는 프로토타입을 기반으로 만들어진 언어이다. 비슷한 object들이 있다면 이들의 비슷한 속성이나 메서드를 하나의 프로토타입으로 만들어서 이를 이용해 객체 지향을 구현한다.
class Animal {
constructor(name, age){
this.name = name;
this.age = age;
}
eat(){
console.log(`${this.name}이 먹는다`)
}
}
let dog = new Animal('choco', 5);
Animal.prototype.constructor === Animal // true
Animal.prototype === dog.__proto__; // true
Animal.prototype.eat === dog.eat; // true
배열 또한 Array 클래스의 인스턴스이다.
Javascript에서 상속을 구현할 때 프로토타입 체인을 사용한다. 부모 클래스로부터 상속받은 자식 클래스는 부모 클래스의 속성과 메서드를 상속받아 사용할 수 있다. extends
와 super
키워드를 통해 상속을 구현할 수 있다.
보통 클래스의 인스턴스는 new
키워드로 생성하지만, DOM에서는 new
대신 createElement
를 사용한다.
Object (모든 클래스의 조상) ← EventTarget ← Node ← Element ← HTMLElement ← HTMLDivElement
document.createElement('div')
) div
엘리먼트는 HTMLElement라는 클래스의 인스턴스이다.div
가 addEventListener 메서드를 사용할 수 있는 이유도 EventTarget을 상속하기 때문! (EventTarget의 프로토타입에 addEventListener 메서드가 있음)