São as classes a nova parte má do JavaScript?

Com a chegada do ES6 muitos dos problemas da única linguagem de programação web do lado do cliente foram corrigidos, muitos deles ainda referentes ao seu nascimento.

Umas das funcionalidades mais pedidas pelos developers era a inclusão de classes (class). Uma vez que os pedidos foram milhares e as discussões em torno deste assunto foram imensas, as ditas classes acabaram por sobreviver até a especificação final da versão 6 do JavaScript. Mas será que realmente resolve problemas ou é apenas uma nova parte má do JavaScript? A verdade é que a keyword class é odiada por um grande numero de pessoas, numero esse igual ou maior aos que apoiam a sua inclusão, uma vez que o JavaScript não contem o conceito de “Class“.

A keyword class é apenas syntax sugar e pode criar confusão na cabeça dos developers. É apenas publicidade falsa!

A parte boa das classes

Muitas pessoas estudaram o paradigma da orientação a objetos, faz parte de qualquer universidade moderna, e nessas aulas de OO foi-lhes ensinado o conceito de classe, polimorfismo, herança e por ai adiante. Em JS já era possível simular o comportamento de uma “Classe” de uma linguagem orientada a objetos, mas era difícil. Até agora a forma de criar “classes”, sub classes e chamar métodos da classe pai era confusa e estranha. Muitos developers de JS apenas querem usar o básico da OO e seguir em frente, mas a syntax “antiga” deixava-os de fora, ninguém quer escrever aquele código feio e parvo.

Sendo assim, a nova keyword class permite que um maior numero de desenvolvedores tenha acesso às funcionalidades citadas anteriormente, mas isto não fez com que a forma “antiga” deixa-se de existir. Assim sendo, existem duas formas diferentes de criar “classes” em JS, uma mais “normal” para os já integrantes do mundo OO e a forma mais hardcore, através do seu prototype.

A nova parte má do JS!

A primeira coisa a perceber é que tudo em JavaScript são objectos, isso quer dizer que objetos são criados mesmo quando não existem classes! A melhor forma de explicar é fazendo uma analogia a seres vivos (neste caso, humanos).

Como pode ser visto na imagem acima, em Java (lado esquerdo) a class Man e Woman estendem uma outra classe, isto quer dizer que estas herdam as propriedades e métodos da sua classe pai (Human). O código abaixo mostra a criação de uma nova instância de Woman:

Woman sofia = new Woman();

Assim sendo, e como as classes em Java funcionam como uma espécie de DNA de um ser vivo, podemos assumir que a classe Woman é também uma instancia de Human e que esta não pode possuir ou assumir outras prioridades ou métodos que não os seus e os herdados do seu pai. Já em JavaScript esta suposição não se verifica.

Em JavaScript (lado direito) o funcionamento é muito semelhante a coisas inanimadas (a objetos da vida real), eles podem ser criados/inventados sem uma classe e vêm como uma espécie de socket plug&play que permite ligar um objeto a qualquer outro. A isto da-se o nome de prototype. Estes objectos podem ganhar/perder propriedades e métodos, assim como serem ligados a outros objetos que não possuem nenhuma relação entre si. É muito flexível em relação as classes propriamente ditas. Assim, podemos criar a Jane que seria o equivalente a criar uma instancia de Woman em Java.

var human = {}

var jane = Object.create(human)

Como pode ser observado, é possível criar um novo objeto praticamente do nada, sem nenhuma estrutura.

Mas qual é o problema afinal?

É claro que as classes são uma mais valia, eu próprio uso-as todos os dias na minha framework, o Stellar. O problema é mesmo “venderem”, digamos, gato por lebre e criar mais uma derivação de paradigma nesta linguagem que é uma verdadeira confusão desde o momento da sua criação.

Em forma de conclusão e resumo deixo uma lista de coisas boas e coisas más da chegadas das classes:

É bom porque:

  • Classes é algo que todos aprendemos e tornar a syntax melhor é uma coisa boa;
  • É uma funcionalidade opcional e existem outras formas de criar objetos;
  • Usar em propósitos bem definidos, não dá problema.

É mau porque:

  • O conceito de “classe” não existe em JavaScript;
  • O conceito de “classes” torna a coisa mais rígida. O uso do prototype faz com que tudo seja mais flexível (podendo também ser uma coisa má, kkk);
  • Cria mais um paradigma dentro da linguagem.

E tu, achas que as classes são uma coisa boa?