Enums não têm nada a ver com OOP, e o JavaScript não tem enums. Em vez disso, as enumerações são usadas sempre que houver uma escolha entre um conjunto fixo de valores. Por exemplo, um booleano é uma escolha entre verdadeiro e falso, que pode ser implementado como enum Bool { False, True }
. Em uma biblioteca GUI, podemos ter um enum para alinhamentos: enum HAlignment { LEFT = -1, CENTER = 0, RIGHT = 1 }
.
Geralmente é irrelevante como o enum é implementado, a parte importante é que cada valor possível é distinto. Muitas linguagens usam números inteiros para enumerações, embora algumas como Java suportem objetos arbitrários.
Até agora, poderíamos também usar constantes, por exemplo const int LEFT = -1, CENTER = 0, RIGHT = 1
. No entanto, um compilador sabe que os valores da enumeração pertencem um ao outro. Portanto, quando alterno os valores de enumeração switch(value) {case LEFT: ...; case RIGHT: ...;}
, o compilador pode me avisar que esqueci o CENTER
caso. Isso pode economizar bastante tempo. Em idiomas sem enumerações ou sem uma construção de caixa de mudança, isso pode ser simulado com o Padrão de Visitante, embora seja mais útil na presença de digitação estática.
A outra vantagem é que as enums podem ser tratadas como um tipo separado. Por exemplo, posso declarar que um método aceita um HAlignment
parâmetro, em vez de qualquer número inteiro. O código falhará na compilação se eu fornecer algo além de um dos três valores possíveis de HAlignment. No entanto, as enumerações de C não são bem encapsuladas e as constantes de enumeração podem ser usadas de forma intercambiável com números inteiros. Outros idiomas são mais rigorosos aqui.
Em JavaScript, não obtemos nenhum desses benefícios. O exemplo dado declara um objeto que é tratado como uma enumeração. Isso tem algumas vantagens para o programador, por exemplo, facilita a documentação, agrupa todas as “constantes” em um único objeto,…. No entanto, é apenas uma convenção de que esse objeto é semelhante a enum.
O ponto aqui é que o HTML tem apenas um conjunto finito e conhecido de tags. Você pode olhar para a especificação HTML5 e colocar esses nomes de elementos como uma enumeração em seu código e, portanto, dificulta a inserção de uma <blink>
tag em seu programa. É melhor codificar esse conhecimento em um único local para desarrumar seu código com literais de strings especiais (ou pior, números mágicos).