Las enumeraciones no tienen nada que ver con OOP, y JavaScript no tiene enumeraciones. En cambio, las enumeraciones se usan siempre que hay una opción entre un conjunto fijo de valores. Por ejemplo, un booleano es una elección entre verdadero y falso, que podría implementarse como enum Bool { False, True }
. En una biblioteca de interfaz gráfica de usuario, podríamos tener una enumeración para las alineaciones: enum HAlignment { LEFT = -1, CENTER = 0, RIGHT = 1 }
.
Por lo general, es irrelevante cómo se implementa la enumeración, la parte importante es que cada valor posible es distinto. Muchos lenguajes usan enteros para enumeraciones, aunque algunos como Java admiten objetos arbitrarios.
Hasta ahora, podríamos haber usado constantes, por ejemplo const int LEFT = -1, CENTER = 0, RIGHT = 1
. Sin embargo, un compilador sabe que los valores de enumeración van de la mano. Entonces, cuando cambio los valores de enumeración switch(value) {case LEFT: ...; case RIGHT: ...;}
, el compilador me puede advertir que he olvidado el CENTER
caso. Esto puede ahorrar mucho tiempo. En lenguajes sin enumeraciones o sin una construcción de mayúsculas y minúsculas, esto puede simularse con el Patrón de visitante, aunque eso es más útil en presencia de tipeo estático.
La otra ventaja es que las enumeraciones pueden tratarse como un tipo separado. Por ejemplo, puedo declarar que un método toma un HAlignment
parámetro, en lugar de cualquier número entero. El código no se compilará si proporciono algo más que uno de los tres posibles valores de HAlignment. Sin embargo, las enumeraciones de C no están bien encapsuladas y las constantes de enumeración se pueden usar indistintamente con enteros. Otros idiomas son más estrictos aquí.
En JavaScript, no obtenemos ninguno de estos beneficios. El ejemplo dado declara un objeto que se trata como una enumeración. Esto tiene algunas ventajas para el programador, por ejemplo, facilita la documentación, agrupa todas las "constantes" en un solo objeto, ... Sin embargo, es solo una convención que tal objeto es como una enumeración.
El punto aquí es que HTML solo tiene un conjunto finito y conocido de etiquetas. Puede mirar la especificación HTML5 y poner esos nombres de elementos como una enumeración en su código y, por lo tanto, hacer que sea más difícil <blink>
introducir una etiqueta en su programa. Es mejor codificar este conocimiento en un lugar que ensucie su código con literales de cadena especiales (o peor, números mágicos).