2020-05-08

JSにおけるpublic/privateについて

Typescriptはプライベートでしか使った経験がないのですが、
publicとかprivateとかが素のJSの機能だと思っていたら違っていた(恥)

もちろん効果は知っていたけど、さすがに境界があいまいなのはアレなのでメモ

JSのドキュメントを見ると当然public/privateの記述はないが、ちゃんと手元でも検証して確認する
まずは素のJSから

class MyClass {
  private hoge = 123
  public fuga = 999
}

// => Uncaught SyntaxError: Unexpected identifier

ということで使えないことを確認
その代わりシャープによるprivateなプロパティを確認する

class MyClass {
  #hoge = 123
  fuga = 999
}

const tes = new MyClass
tes.fuga //=> 999
tes.#hoge // => Uncaught SyntaxError: Private field '#hoge' must be declared in an enclosing class

ここまでは素のJSの機能
ついでに static は素のJSであることをチェック

class MyClass {
  #hoge = 123
  fuga = 999
  static bar = 555
}

MyClass.bar //=> 555

ではTSで確認(TS公式のPlayground使用)

class MyClass {
  public hoge: number = 999
  private fuga: number = 123
  static bar: number = 555
  protected baz: number = 987
}

const tes: MyClass = new MyClass
tes.hoge //=> 999
tes.fuga //=> Property 'fuga' is private and only accessible within class 'MyClass'.
tes.baz //=> Property 'baz' is protected and only accessible within class 'MyClass' and its subclasses.
MyClass.bar //=> 555

クラスのプロパティ/メソッドはデフォルトでどこからでもアクセスできるので、publicは明示的に外部に公開したくない場合に使用する感じだろう
privateprotected の違いは見ての通り