Modern JavaScript Deep Dive 스터디 - CH25 클래스
참고 자료: ⟪모던 자바스크립트 Deep Dive⟫"(이웅모 지음,위키북스, 2020)
클래스 vs 생성자 함수
- 클래스를
new
연산자 없이 호출하면 에러가 발생. 그러나 생성자 함수를 new 연산자 없이 호출하면 일반 함수로서 호출- 클래스는 상속을 지원하는 extends와 super 키워드를 제공
- 클래스는 호이스팅이 발생하지 않는 것 처럼 동작. 함수 선언문으로 선언한 생성자 함수는 함수호이스팅, 함수 표현식으로 선언한 생성자 함수는 변수 호이스팅이 발생
- 클래스 내의 모든 코드는 암묵적 strict mode로 지정되고, 해제할 수 없음
- 클래스의 constructor, 프로토타입 메서드, 정적 메서드는 모두 프로퍼티 어티리뷰트
[[Enumeralble]]
의 값이false
-> 열거 불가
새로운 객체 생성 매커니즘
class
키워드를 사용해 정의파스칼 케이스
를 사용하는 것이 일반적// 익명 클래스 표현식
const Person = class {};
// 기명 클래스 표현식
const Person = class MyClass {};
클래스는 함수로 평가 됨
변수 선언, 함수 정의와 마찬가지로 호이스팅이 발생
let
, const
키워드로 선언한 변수처럼 호이스팅 되어 선언과 초기화가 분리되어 진행되기 때문const Person = "";
{
// 호이스팅이 발생하지 않는다면 ''이 출력되어야 한다.
console.log(Person);
// ReferenceError: Cannot access 'Person' before initialization
// 클래스 선언문
class Person {}
}
생성자 함수로서 호출할 수 있는 함수
, 즉 constructor
생성자 함수로서 호출할 수 있는 함수
는 함수 정의가 평가되어 함수 객체를 생성하는 시점에 프로토타입도
더불어 생성const Person = class MyClass {};
// 함수 표현식과 마찬가지로 클래스를 가리키는 식별자로 인스턴스를 생성해야 한다.
const me = new Person();
// 클래스 이름 MyClass는 함수와 동일하게 클래스 몸체 내부에서만 유효한 식별자다.
console.log(MyClass); // ReferenceError: MyClass is not defined
const you = new MyClass(); // ReferenceError: MyClass is not defined
- constructor
- 프로토타입 메서드
- 정적 메서드
class Person {
// 생성자
constructor(name) {
// 인스턴스 생성 및 초기화
this.name = name;
}
}
return
을 사용 안하는 것이 바람직함return
하면 해당 객체가 반환return
하면 무시하고 암묵적으로 this 반환class Person {
// 생성자
constructor(name) {
// 인스턴스 생성 및 초기화
this.name = name;
}
// 프로토타입 메서드
sayHi() {
console.log(`Hi! My name is ${this.name}`);
}
}
const me = new Person("Lee");
me.sayHi(); // Hi! My name is Lee
// me 객체의 프로토타입은 Person.prototype이다.
Object.getPrototypeOf(me) === Person.prototype; // -> true
me instanceof Person; // -> true
// Person.prototype의 프로토타입은 Object.prototype이다.
Object.getPrototypeOf(Person.prototype) === Object.prototype; // -> true
me instanceof Object; // -> true
// me 객체의 constructor는 Person 클래스다.
me.constructor === Person; // -> true
static
키워드를 붙여서 생성class Person {
// 생성자
constructor(name) {
// 인스턴스 생성 및 초기화
this.name = name;
}
// 정적 메서드
static sayHi() {
console.log("Hi!");
}
}
정적 메서드
는 인스턴스로 호출할수 없고 클래스로 호출function
키워드를 생략한 메서드 축약 표현을 사용strict mode
실행for ... in
문이나 Object.keys
메서드 등으로 열거 불가[[Enumerable]]
의 값이 false
[[Construct]]
를 갖지 않는 non-constructor
-> new
연산자와 함께 호출할 수 없음