Você só sofre com isso por que não conhece Javascript e também não conhece bem o conceito de instancia.

Relembrando o drops é o onde eu falo o que eu quero sem muita pesquisa, jogo um pouco do que conheço e do que acho, com base no que já vivi e lembro, posso estar enganado. Estamos aqui para aprender :)

Estou lendo um artigo onde a pessoa reclama da imutabilidade do Javascript, essa é uma reclamação constante e mostra para mim na hora quem conhece e quem não conhece Javascript. É triste alguém assim submeter uma proposta para a TC39, pelo menos eu acho, mas beleza, se quiser entender ler é sobre algumas definições que levaram a escrita do Temporal Proposal.

Instancia em Javascript

Vamos falar sobre objetos, já escrevi algo mais aprofundado e que precisar se ainda mais aprofundando quando falei sobre referencias, voltando ao ponto sobre instancia.

A instancia é um conceito que parece que se perdeu do nada e ninguém mais lembra dela, com a programação funcional a galera esquece que javascript tem o pé Orientação a Objeto e esquece objetos instancias e objetos literais. Eu sei esse conceito não aparece em outras linguagens eu acho...

Mas falando de instancia ela é quando você materializa um definição de um objeto. Um objeto literal é um dicionário pronto para ser usado, diferente de um objeto instanciado. Com esse conceito em mente, vamos lembrar que a instancia de um objeto pode ter funções que alteram as propriedades do objeto, logo ao usar uma função em que ela modifica uma propriedade, essa propriedade é mutável.

E quanto fazemos uma instancia de objeto? Quando chamamos o objeto usando o new.

Agora indo no exemplo do artigo linkado no começo, se temos uma instancia da data, ao usar um setMonthele deve mudar a data do meu objeto instanciado com new Date().

Para ficar mais claro, segue o exemplo do artigo.

const date = new Date();
date.toISOString(); //"2017-04-05T05:57:53.350Z";
date.setMonth(11);
date.toISOString();//"2017-12-05T05:57:53.350Z";
Código com "problemas" de imutabilidade.

Você usou uma função que modifica a data, você esperava o que? Que o software jogasse uma flor na tela? Eu concordo que em objetos literais imutabilidade é importante, mas não na instancia.

Não compreender a instancia em Javascript causa problemas e também não compreender que objetos literais também são mutáveis. Preciso explicar? Talvez no futuro...

Resolvendo a treta de mutabilidade

Primeiro pergunto é necessário?

Vamos o ponto mais importante, se você está mudando a propriedade de um objeto, saiba lidar com isso. Mudar propriedades gera efeitos colaterais e isso é um problema que programação funcional tenta evitar, porém o paradigma de Javascript é orientado...

Mas digamos que preciso da data intacta e outra que vou mudar, então entenda os comportamentos e os efeitos colaterais. Vamos usar o exemplo acima, se queremos preservar o resultado da chamada do toISOString(), basta declarar ele em uma constante, assim você tem a String preservada e o objeto pode ser modificado. Vamos ver código:

const date = new Date();
const isoDate = date.toISOString(); // "2017-04-05T05:57:53.350Z"
date.setMonth(11) // você modificou uma propriedade é por sua conta e risco
date.toISOString() // "2017-12-05T05:57:53.350Z"
// Porém...
const dateFixed = new Date(isoDate);
dateFixed.toISOString() // "2017-04-05T05:57:53.350Z"

Claro que o dateFixeddo exemplo ele é mutavel, mas a string isoDate não é, graças ao constque é recente em Javascript, mas ajuda a enteder o ponto. Quando crio o new Date(isoDate), consigo gerar uma nova instancia que não sofre efeito colateral das mudanças do objeto date.

Em linhas gerais a questão de imutabilidade no Javascript ela sempre vai acontecer para objetos com setters são para isso eles server, modificar uma propriedade de um objeto. Saber trabalhar com objetos é importante também em Javascript.

No exemplo que temos com datas e setMonth, sempre que ele é usado alteramos a instancia do date, entender que podemos criar uma outra instancia limpa ajudar também a evitar os problemas e preservar informações.

Sabe como fazemos para transferir liquidos de dois copos cheios? Pegamos um terceiro copo. – Professora Luciana, SENAI Vicente Amato 2007, aulas de lógica de programação.

É isso galera, lembra instancias podem ser mutáveis e podem ter efeitos colaterais, saber lidar com isso evita problemas.

Se você concorda, discorda, encontrou algum erro, pode acrescentar em algo, só me falar no twitter.


https://en.wikipedia.org/wiki/Instance_(computer_science)

Photo by Daria Shevtsova from Pexels