Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida sobre classes no JavaScript

Por qual razão (motivo) as classes do JavaScript não possuem modificadores de acesso do tipo private, protected e afins?

Existe alguma forma de criar um atributo fora de um método como em outras linguagens? Por exemplo:

// exemplo do que eu imagino que deveria funcionar
// ou ter alguma forma de fazer
class Pessoa {

  nome = 'adriano';

  digaOla() {
    console.log(`${nome} falou olá`)
  }
}
2 respostas

Cara tecnicamente existe modificadores de acesso, mas não da maneira como em outras linguagens.

Por exemplo para definir uma variável de escopo publico (public) podemos fazer da seguinte maneira:

function Conta(){
    this.numero;
}

E para definir uma variável de escopo privado (private) podemos escrever a mesma classe dessa forma:

function Conta() {
    var numero;

    this.setNumero = function(_numero){
        numero = _numero;
    }
}

Lembrando que essa implementação estou usando o ES5, mas o mesmo conceito se aplica ao ES6. Não existe o modificado de protegido, não que eu saiba.

Tem esse artigo da Caelum que explica de uma forma bem dinâmica o conceito de modificadores de acesso no JavaScript http://blog.caelum.com.br/javascript-entenda-a-nova-especificacao-de-classes-do-harmony-es6/

solução!

Estava estudando um pouco sobre o assunto e acabei encontrando uma resposta para minha própria pergunta. Parece que no JavaScript nativo ainda não é possível utilizar modificadores de acesso, mas está sendo discutido e implementado pelo TC39 uma proposta para tais recursos. Salve engano, foi uma decisão do TC39 lançar uma especificação de classes um pouco mais simples para não quebrar a compatibilidade do JavaScript, principalmente com os browsers. Parece que a intenção da galera era verificar se a comunidade iria curtir esse novo recurso para só então irem adicionando novas funcionalidades no decorrer das novas versões. A sintaxe é um pouco estranha, mas quando for finalizado parece que as classes terão modificadores de acesso.

Field declarations

class Counter extends HTMLElement {
  x = 0;

  clicked() {
    this.x++;
    window.requestAnimationFrame(this.render.bind(this));
  }

  constructor() {
    super();
    this.onclick = this.clicked.bind(this);
  }

  connectedCallback() { this.render(); }

  render() {
    this.textContent = this.x.toString();
  }
}
window.customElements.define('num-counter', Counter);

Private fields

class Counter extends HTMLElement {
  #x = 0;

  clicked() {
    this.#x++;
    window.requestAnimationFrame(this.render.bind(this));
  }

  constructor() {
    super();
    this.onclick = this.clicked.bind(this);
  }

  connectedCallback() { this.render(); }

  render() {
    this.textContent = this.#x.toString();
  }
}
window.customElements.define('num-counter', Counter);