25.1 클래스는 프로토타입의 문법적 설탕인가?

자바스크립트는 프로토타입 기반의 객체지향 언어다.

클래스 없이도 프로토타입을 통해 객체지향 언어의 상속을 구현할 수 있다.

ES6에서 클래스가 도입됐으며, 프로토타입 기반 패턴을 클래스 기반 패턴처럼 사용할 수 있도록 하는 문법적 설탕이기도 하다.

단, 클래스는 생성자 함수보다 엄격하며 생성자 함수에서 제공하지 않는 기능도 제공한다.

  1. 클래스는 new 연산자 없이 호출하면 에러가 발생한다. 하지만 생성자 함수는 new 연산자 없이 호출하여 일반 함수로서 호출할 수 있다.
  2. 클래스는 상속을 지원하는 extendssuper 키워드를 제공한다. 생성자 함수는 지원하지 않는다.
  3. 클래스는 호이스팅이 발생하지 않는 것 처럼 동작한다.
  4. 클래스 내의 모든 코드에는 암묵적으로 strict mode 가 지정되어 실행되며, strict mode 를 해제할 수 없다. 생성자 함수는 암묵적으로 strict mode 가 지정되지 않는다.
  5. 클래스의 constructor, 프로토타입 메서드, 정적 메서드 는 모두 프로퍼티 어트리뷰트 [[Enumerable]] 의 값이 false 다. 즉, 열거되지 않는다.

클래스의 extendssuper 키워드는 상속 관계 구현을 더욱 간결하고 명료하게 한다.

클래스를 프로토타입 기반 객체 생성 패턴의 단순 문법적 설탕보다는 새로운 객체 생성 메커니즘으로 보는 것이 좀 더 합당하다.

25.2 클래스 정의

// 클래스 선언문
class Person {}

// 익명 클래스 표현식
const Person = class {};

// 기면 클래스 표현식
const Person = class MyClass {};

클래스는 값처럼 사용할 수 있는 일급 객체다.

클래스 몸체에는 0개 이상의 메서드만 정의할 수 있다.