[Javascript] Private class fields

in #dblog2 years ago

저는 종종 공부하다가 모르는 부분이 나오면 바로 궁금증을 해결하는 타입이다보니..

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 worl​d"
Sort:  

Congratulations @happyberrysboy! You have completed the following achievement on the Hive blockchain and have been rewarded with new badge(s):

You distributed more than 27000 upvotes.
Your next target is to reach 28000 upvotes.

You can view your badges on your board and compare yourself to others in the Ranking
If you no longer want to receive notifications, reply to this comment with the word STOP

To support your work, I also upvoted your post!

Support the HiveBuzz project. Vote for our proposal!