Embora as classes estejam disponíveis para o JavaScript desde o ES2015, elas não incluem campos e métodos privados. Esses recursos foram descartados durante o release inicial devido a divergências no comitê do TC39. Três rascunhos de especificações pretendem levar esses recursos às classes JavaScript em um futuro próximo.
Depois que essas especificações forem formalmente aceitas, os campos e métodos privados poderão ser definidos usando o sinal de hash ‘#’. A decisão de usar o sinal de hash em vez do sublinhado mais tradicional ‘_’ foi tomada para evitar alterações nas bibliotecas existentes, que atualmente marcam os campos privados dessa maneira.
Isso pode parecer contra intuitivo, no entanto, apesar das bibliotecas marcarem campos ou métodos como privados usando o sublinhado, os desenvolvedores de sinal ainda os usam. Transformar essas variáveis em variáveis verdadeiramente privadas pode interromper vários aplicativos e, portanto, retardar a adaptação das novas especificações.
O problema pode ser demonstrado por uma anedota do React, que teve que recorrer a alguns nomes de variáveis bastante contundentes para impedir que os desenvolvedores os usassem (apesar de serem marcados como privados), como ‘_SECRET_DOM_DO_NOT_USE_ORYOU_WILL_BE_FIRED’. (Lê-se _DOM_SECRETO_NAO_USE_OU_VOCE_SERA_DEMITIDO ).
Cada uma das 3 propostas do TC39 aborda um aspecto diferente de campos e métodos privados nas classes. No entanto, deve ser seguro tratá-los como uma única proposta, pois provavelmente serão adicionados ao JavaScript ao mesmo tempo. As propostas são:
Declaração de campos da classe
Atualmente não é possível definir campos (variáveis) direto na classe. Ao invés disso, os desenvolvedores precisam fazê-lo diretamente no construtor da classe.
class Counter { constructor() { this.xValue = 0; } }
A proposta pretende adicionar esta habilidade para escrever os campos diretamente na definição da classe.
class Counter { xValue = 0; #yValue = 0; constructor() { } }
Criação de métodos privados e de getter e setters privados para as classes.
Esta proposta pretende permitir a adição de métodos privados e o uso de getter e setter privados.
class Counter { get #x() { return #xValue; } set #x(value) { } #clicked() { } }
Funcionalidades de classes estáticas (static).
Esta proposta define como será implementado a funcionalidade de campos e métodos estáticos, podendo ser públicos ou privados.
class CustomDate { static public() = {} static #private() = {} }
Para mais informações veja o post original no link abaixo:
Fonte: https://www.infoq.com/news/2019/10/javascript-private-class-fields/