클래스는 객체 지향 프로그래밍에서 특정 객체를 생성하기 위해 변수와 메소드를 정의하는 일종의 틀로, 객체를 정의하기 위한 상태(멤버 변수)와 메서드(함수)로 구성된다. 위키백과
class MyClass {
// 여러 메서드를 정의할 수 있음
constructor() { ... }
method1() { ... }
method2() { ... }
method3() { ... }
...
}
// 사용시
const cls = new Myclass;
자바스크립트에서 클래스는 함수의 한 종류이다.
class User {
constructor(name) { this.name = name; }
sayHi() { alert(this.name); }
}
// User가 함수라는 증거
alert(typeof User); // function
class User {...} 문법 구조가 진짜 하는 일은 다음과 같습니다.
class User {
constructor(name) { [this.name](<http://this.name/>) = name; }
sayHi() { alert([this.name](<http://this.name/>)); }
}
// 클래스는 함수입니다.
alert(typeof User); // function
// 정확히는 생성자 메서드와 동일합니다.
alert(User === User.prototype.constructor); // true
// 클래스 내부에서 정의한 메서드는 User.prototype에 저장됩니다.
alert(User.prototype.sayHi); // alert([this.name](<http://this.name/>));
// 현재 프로토타입에는 메서드가 두 개입니다.
alert(Object.getOwnPropertyNames(User.prototype)); // constructor, sayHi
class로 만든 함수엔 특수 내부 프로퍼티인 [[IsClassConstructor]]: true 이다.
클래스 생성자를 new와 함께 호출하지 않으면 에러가 발생하는데 이 때 [[IsClassConstructor]]: true가 사용된다.
class User {
constructor() {}
}
alert(typeof User); // User의 타입은 함수이긴 하지만 그냥 호출할 수 없습니다.
User(); // TypeError: Class constructor User cannot be invoked without 'new'
클래스 생성자를 문자열로 형변환하면 'class…'로 시작하는 문자열이 되는데 이때도 [[IsClassConstructor]]: true가 사용된다.
class User {
constructor() {}
}
alert(User); // class User { ... }
클래스의 prototype 프로퍼티에 추가된 메서드의 enumerable 플래그는 false이다.
클래스 생성자 안 코드 전체엔 자동으로 엄격 모드가 적용된다.