🤔클래스의 인스턴스 생성과정
- new 연산자와 함께 클래스를 호출하면 생성자 함수와 마찬가지로 [[Construct]]가 호출된다.
- 인스턴스 생성과 this 바인딩
- constructor 코드가 실행되기 앞서 빈 객체가 생성된다. 이 객체가 인스턴스이다.
- 인스턴스의 프로토타입으로 클래스의 prototype이 설정된다.
- 인스턴스에 this가 바인딩된다.
- 인스턴스 초기화
- constructor가 인수로 받은 초기화 값을 인스턴스 프로퍼티 값으로 초기화 한다.
- constructor가 생략되었다면, 이 과정 역시 생략된다.
- 인스턴스 반환
- 암묵적으로 this가 반환된다.
🤨클래스의 프로퍼티
인스턴스 프로퍼티
- constructor 내부에서 정의한다
- 접근 제한자 없이는 항상 public값으로 가진다.
접근자 프로퍼티
- 자체적인 값([[Value]] 내부슬롯)을 갖지 않는다.
- 다른 프로퍼티를 읽거나 저장하는 접근자 함수이다.
- get, set 키워드를 사용하여 정의가 가능하다.
- 기본적으로 인스턴스의 프로퍼티가 아닌 프로토타입의 프로퍼티가 된다.
정적 메서드
- static 키워드를 이용하여 정적 메서드로 만들 수 있다
- 정적 메서드는 클래스에 바인딩 되어 인스턴스에서 참조할 수 없다.
🤔클래스 필드 정의 제안?
- 클래스 필드란 클래스 기반 객체 지향 언어에서 클래스가 생성할 인스턴스의 프로퍼티를 가리키는 용어
- 자바스크립트 클래스에서는 프로퍼티를 선언하고 초기화 하려면 constructor 내부에서 this 프로퍼티가 필요하다.
- 하지만 아래 코드는 유효하다
class Person {
name = "Lee";
}
const me = new Person()
- 클래스 필드를 정의하는 경우 this에 클래스 필드를 바인딩 해서는 안 된다.
class Person {
this.name // SyntaxError
}
- 함수 역시 일급 객체 이므로 클래스 필드에 할당할 수 있다. 하지만 모든 클래스 필드는 인스턴스 프로퍼티가 되고, 함수 역시 프로토타입 메서드가 아닌 인스턴스 메서드가 되므로 클래스 필드에 함수를 할당하는 것은 옳지 않다.
🤔private 필드 정의 제안
- #을 이용하여 private필드를 정의할 수 있다.
- 필드를 참조할 때도 #을 붙여야 한다.
class PrivateFiled {
#privateProperty = 'foo'
publicPropery = 'bar'
//private instance method
#privateMethod() {
return 'Kim'
}
publicMethod() {
return this.#privateProperty;
}
}
const obj = new PrivateFiled()
console.log(obj.#privateProperty) // Error
console.log(obj.publicPropery) // bar
console.log(obj.publicMethod()) // foo
console.log(obj.#privateMethod()) // Error
- private 필드는 클래스 몸체에 정의해야 한다. constructor 내부에서 정의하면 에러가 발생한다.
🤔static 필드 정의 제안
- static 키워드를 사용하여 정적 필드를 정의할 수 있다
class MyMath{
//static public 필드 정의
static PI = 22/7;
//static private 필드 정의
static #num = 10;
//static 메서드
static increment(){
return ++MyMath.#num;
}
}
'기술 서적 > 하루 30분 모딥다' 카테고리의 다른 글
[하루 30분 모던 자바스크립트 딥 다이브] 이벤트 핸들러 등록 방식 (0) | 2023.08.30 |
---|---|
[하루 30분 모던 자바스크립트 딥 다이브] 상속에 의한 클래스 확장 (0) | 2023.07.26 |
[하루 30분 모던 자바스크립트 딥 다이브] 클래스 (0) | 2023.07.24 |
[하루 30분 모던 자바스크립트 딥 다이브] 클로저의 캡슐화와 정보은닉 (0) | 2023.07.22 |
[하루 30분 모던 자바스크립트 딥 다이브] 클로저란 무엇인가 (0) | 2023.07.21 |