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

Classe não tão imutável

Olá!

Durante a aula, criamos uma classe para que fosse o mais imutável possível:

class Negociacao{

    constructor(data, quantidade, valor){
        this._data = new Date(data.getTime());
        this._quantidade = quantidade;
        this._valor = valor;
        Object.freeze(this);
    }

    get volume() {

        return this._quantidade * this._valor;
    }

    get data() {

        return new Date(this._data.getTime());
    }

    get quantidade() {

        return this._quantidade;
    }

    get valor() {

        return this._valor;
    }
}

Dessa forma quanto a propriedade "data" de uma instância, não podemos altera-la pelo método:

 let n1 = new Negociacao(new Date(), 1, 1);
 n1.data.setDate(n1.data.getDate() + 1);

E nem alterando a instância utilizada no construtor:

let novaData = new Date();
 let n1 = new Negociacao(novaData, 1, 1);
novaData.setDate(n1.data.getDate() + 1);

Porém ainda existe o risco de altera-lá através da propriedade em si, ainda que sendo contra a convenção:

let n1 = new Negociacao(new Date(), 2, 2);
 n1._data.setDate(n1.data.getDate() + 1);

Será que existe alguma maneira de contornar isso também?

2 respostas
solução!

Opa Marcos Gaiotto,

Nativamente o js ainda não tem um meio de definir atributos privados para classe.

Mas já tem um proposta dessa nova funcionalidade, você pode acompanhá-la aqui nesse link, atualmente esta em stage 3 (stage 4 é quando está finalizada).

Aqui está uma exemplo de como será a declaração e utilização de atributos privados.

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);

No entanto outra solução é usar o TypeScript , na documentação ele explica direitinho como é utilizado, segue o [link para documentação] (https://github.com/tc39/proposal-class-fields).

Espero ter ajudado :)

Oi Matheus,

Realmente com essa funcionalidade as coisas ficarão bem mais fáceis, vou acompanhar isso!

Também não conhecia o TypeScript, vou dar uma estudada nele a partir de agora.

Ajudou bastante, Obrigado!