저는 종종 공부하다가 모르는 부분이 나오면 바로 궁금증을 해결하는 타입이다보니..
JS를 조금 쓸 일이 있었는데 모르는 부분이 나와서 정리 해봅니다.
생각보다 JS 이거 자주 바뀌는군요..!!
평소에 자주 쓰는 스타일은 아니긴 한데 class의 private fields 에 관한 내용입니다.
ES2019 이후
#prefix를 추가해서 private class fields 선언이 가능해졌습니다.
Syntax
// private variable
class ClassWithPrivateField {
#privateField
}
// private function
class ClassWithPrivateMethod {
#privateMethod() {
return 'hello world'
}
}
// private static variable
class ClassWithPrivateStaticField {
static #PRIVATE_STATIC_FIELD
}
private static field
- private 필드는 class 선언부 내부의 생성자에서 접근이 가능합니다.
- static 메소드에서만 static 변수들을 호출 할 수 있습니다.
class ClassWithPrivateStaticField {
static #PRIVATE_STATIC_FIELD
static publicStaticMethod() {
// 여기에서 this 대신 class 명을 써준 이유는, this가 오작동을 일으킬 수 있기 때문에 아래와 같이 사용해야 합니다.
ClassWithPrivateStaticField.#PRIVATE_STATIC_FIELD = 42
return ClassWithPrivateStaticField.#PRIVATE_STATIC_FIELD
}
}
console.assert(ClassWithPrivateStaticField.publicStaticMethod() === 42)
Private instance fields
prefix는 이름 자체가 그대로 사용되어 지며, 선언 부분과 호출 시 모두 사용됩니다.
- private 변수이므로 외부에서 호출하는 것은 불가능합니다.
class ClassWithPrivateField {
#privateField
constructor() {
this.#privateField = 42
this.#randomField = 444 // Syntax error
}
}
const instance = new ClassWithPrivateField()
instance.#privateField === 42 // Syntax error
Private Methods
- private static 메소드는 public static 메소드처럼 인스턴스가 아닌 class 로부터 호출이 가능합니다
- private static 필드처럼 class 선언문 내부에서만 접근 가능합니다.
class ClassWithPrivateStaticMethod {
static #privateStaticMethod() {
return 42
}
static publicStaticMethod1() {
return ClassWithPrivateStaticMethod.#privateStaticMethod();
}
// this 사용시에는 this binding rule로 인하여 오작동을 할 수 있으니 위와 같이 사용을 권장합니다.
static publicStaticMethod2() {
return this.#privateStaticMethod();
}
}
console.assert(ClassWithPrivateStaticMethod.publicStaticMethod1() === 42);
console.assert(ClassWithPrivateStaticMethod.publicStaticMethod2() === 42);
Private instance methods
- private 인스턴스 메소드는 private 인스턴스 필드와는 다르게 class 인스턴스로부터 접근 가능합니다.
class ClassWithPrivateMethod {
#privateMethod() {
return 'hello world'
}
getPrivateMessage() {
return this.#privateMethod()
}
}
const instance = new ClassWithPrivateMethod()
console.log(instance.getPrivateMessage())
// expected output: "hello world"