클래스가 필요 없는 객체 지향 프로그래밍 언어
(클래스 없이도 생성자 함수와 프로토타입을 통해 구현 가능)
클래스 | 생성자 함수 |
---|---|
new 연산자 필수 | new 연산자 없이 호출 시, 일반 함수로 호출됨 |
extends, super 키워드 제공 | X |
호이스팅이 발생하지 않은 것 처럼 동작 | 호이스팅 O |
클래스 내 모든 코드에 strict mode 적용 | X |
// 선언문 (일반적 방식)
class Person {
// 생성자
constructor(name) { ... }
// 프로토타입 메서드
sayHi() { ... }
// 정적 메서드
static sayHello() { ... }
}
// 표현식으로 정의 가능
// -> 클래스가 일급 객체라는 것을 의미
const Person = class {};
(생성자 함수의 정의 방식)
var Person = (function () {
// 생성자 함수
function Person(name) { ... }
// 프로토타입 메서드
Person.prototype.sayHi = function () { ... }
// 정적 메서드
Person.sayHello = function () { ... }
return Person;
}());
일급 객체로서의 클래스
- 무명의 리터럴로 생성 가능(런타임에 생성 가능)
- 변수나 자료구조에 저장 가능
- 함수의 매개변수에 전달 가능
- 함수의 반환값으로 사용 가능
static
키워드 사용Class field declarations
- 클래스 몸체에서 클래스 필드를 정의할 수 있도록 제안된 사양
- 최신 브라우저(Chrome 72 이상), 최신 Node.js(버전 12 이상)에서 구현 가능
Class field private fields
- private 필드를 정의할 수 있도록 제안된 사양
- 최신 브라우저(Chrome 72 이상), 최신 Node.js(버전 12 이상)에서 구현 가능
- 필드를 선언, 참조할 때 선두에 # 붙이기
ex. #name = '...';
Class field static class features
- static 키워드를 사용하여 정적 필드를 정의할 수 있도록 제안된 사양
- 최신 브라우저(Chrome 72 이상), 최신 Node.js(버전 12 이상)에서 구현 가능
- 정적 필드: static public 필드, static private 필드, static private 메서드
// 슈퍼(베이스/부모) 클래스
class Base {}
// 서브(파생/자식) 클래스
class Derived extends Base {}
// 생성자 함수 상속 가능
function Base( ... ) {... }
class Derived extends Base {}
// 표현식을 이용한 동적 상속 가능
class Derived extends (condition ? Base1 : Base2) {}
상속 클래스의 인스턴스 생성과정
- 서브클래스의 super 호출
- 슈퍼클래스에게 인스턴스 생성 위임
- 슈퍼클래스의 인스턴스 생성과 this 바인딩
- 인스턴스 생성은 슈퍼클래스,
생성된 인스턴스의 타입은 서브클래스의 protorype 프로퍼티가 가리키는 객체- 슈퍼클래스의 인스턴스 초기화
- 서브클래스 constructor로의 복귀와 this 바인딩
- 서브클래스는 별도의 인스턴스 생성없이,
super가 반환한 인스턴스를 this에 바인딩하여 사용- 서브클래스의 인스턴스 초기화
- 인스턴스 반환