|
| 1 | +// ENUMS en JavaScript |
| 2 | +/* |
| 3 | +Los enums en JavaScript son una forma de crear un conjunto de constantes que pueden ser utilizadas en cualquier parte de nuestro código. |
| 4 | +los enumeradores (enums) no existen como una característica nativa del lenguaje, pero podemos simularlos utilizando objetos o técnicas específicas. |
| 5 | +
|
| 6 | +¿Cómo crear un ENUM en JavaScript? |
| 7 | +En JavaScript, los ENUM se pueden implementar de varias formas. Aquí te muestro las más comunes: |
| 8 | +
|
| 9 | +1. Usando un objeto: |
| 10 | +La forma más sencilla de crear un ENUM es utilizando un objeto donde las claves son los nombres de las constantes y los valores son los valores asociados. |
| 11 | +Por ejemplo: |
| 12 | +*/ |
| 13 | +const DaysOfWeek = { |
| 14 | + MONDAY: 'Monday', |
| 15 | + TUESDAY: 'Tuesday', |
| 16 | + WEDNESDAY: 'Wednesday', |
| 17 | + THURSDAY: 'Thursday', |
| 18 | + FRIDAY: 'Friday', |
| 19 | + SATURDAY: 'Saturday', |
| 20 | + SUNDAY: 'Sunday', |
| 21 | + }; |
| 22 | + |
| 23 | +console.log(DaysOfWeek.MONDAY); |
| 24 | +console.log(DaysOfWeek.TUESDAY); |
| 25 | + |
| 26 | +/* |
| 27 | +2. Usando Object.freeze(): |
| 28 | +Para evitar que el objeto sea modificado accidentalmente, puedes usar Object.freeze. Esto hace que el objeto sea inmutable. |
| 29 | +*/ |
| 30 | +const DaysOfWeek2 = Object.freeze({ |
| 31 | + MONDAY: 'Monday', |
| 32 | + TUESDAY: 'Tuesday', |
| 33 | + WEDNESDAY: 'Wednesday', |
| 34 | + THURSDAY: 'Thursday', |
| 35 | + FRIDAY: 'Friday', |
| 36 | + SATURDAY: 'Saturday', |
| 37 | + SUNDAY: 'Sunday', |
| 38 | + }); |
| 39 | +DaysOfWeek2.MONDAY = 'New Day'; // Esto no tendrá efecto |
| 40 | +console.log(DaysOfWeek2.MONDAY); // Output: Monday |
| 41 | +/* |
| 42 | +3. Usando Symbol para mayor seguridad |
| 43 | +Los símbolos son únicos y pueden ser útiles para evitar colisiones de nombres. |
| 44 | +*/ |
| 45 | +const Colors = Object.freeze({ |
| 46 | + RED: Symbol('red'), |
| 47 | + GREEN: Symbol('green'), |
| 48 | + BLUE: Symbol('blue'), |
| 49 | + }); |
| 50 | + |
| 51 | +console.log(Colors.RED); |
| 52 | +console.log(Colors.RED.description); // Output: red |
| 53 | + |
| 54 | +/* |
| 55 | +4. Usando map: |
| 56 | +Un Map permite asignar valores personalizados sin perder flexibilidad |
| 57 | +*/ |
| 58 | +const UserRole = new Map([ |
| 59 | + ["ADMIN", { level: 3, canEdit: true, canDelete: true }], |
| 60 | + ["EDITOR", { level: 2, canEdit: true, canDelete: false }], |
| 61 | + ["USER", { level: 1, canEdit: false, canDelete: false }] |
| 62 | + ]); |
| 63 | + |
| 64 | + // ✅ Uso del Enum |
| 65 | +console.log(UserRole.get("EDITOR")); // { level: 2, canEdit: true, canDelete: false } |
| 66 | +console.log(UserRole.get("USER").canEdit); // false |
| 67 | + |
| 68 | + |
| 69 | +/* |
| 70 | + * EJERCICIO: |
| 71 | + * Empleando tu lenguaje, explora la definición del tipo de dato |
| 72 | + * que sirva para definir enumeraciones (Enum). |
| 73 | + * Crea un Enum que represente los días de la semana del lunes |
| 74 | + * al domingo, en ese orden. Con ese enumerado, crea una operación |
| 75 | + * que muestre el nombre del día de la semana dependiendo del número entero |
| 76 | + * utilizado (del 1 al 7). |
| 77 | + */ |
| 78 | + |
| 79 | +// Definimos un objeto con las constantes que necesitamos |
| 80 | +const diasDeLaSemana = { |
| 81 | + LUNES: 1, |
| 82 | + MARTES: 2, |
| 83 | + MIERCOLES: 3, |
| 84 | + JUEVES: 4, |
| 85 | + VIERNES: 5, |
| 86 | + SABADO: 6, |
| 87 | + DOMINGO: 7 |
| 88 | +}; |
| 89 | + |
| 90 | +// Utilizamos las constantes en nuestro código, por ejemplo: |
| 91 | + |
| 92 | +let dia = diasDeLaSemana.LUNES; |
| 93 | +console.log(dia); // 1 |
| 94 | + |
| 95 | +// Podemos utilizar un switch para hacer algo diferente dependiendo del valor de la constante: |
| 96 | +switch (dia) { |
| 97 | + case diasDeLaSemana.LUNES: |
| 98 | + console.log('Hoy es Lunes'); |
| 99 | + break; |
| 100 | + case diasDeLaSemana.MARTES: |
| 101 | + console.log('Hoy es Martes'); |
| 102 | + break; |
| 103 | + case diasDeLaSemana.MIERCOLES: |
| 104 | + console.log('Hoy es Miércoles'); |
| 105 | + break; |
| 106 | + case diasDeLaSemana.JUEVES: |
| 107 | + console.log('Hoy es Jueves'); |
| 108 | + break; |
| 109 | + case diasDeLaSemana.VIERNES: |
| 110 | + console.log('Hoy es Viernes'); |
| 111 | + break; |
| 112 | + case diasDeLaSemana.SABADO: |
| 113 | + console.log('Hoy es Sábado'); |
| 114 | + break; |
| 115 | + case diasDeLaSemana.DOMINGO: |
| 116 | + console.log('Hoy es Domingo'); |
| 117 | + break; |
| 118 | + default: |
| 119 | + console.log('Día no válido'); |
| 120 | +} |
| 121 | + |
| 122 | +// Podemos hacer un bucle para recorrer todas las constantes: |
| 123 | +for (let dia in diasDeLaSemana) { |
| 124 | + console.log(diasDeLaSemana[dia]); |
| 125 | +} |
| 126 | + |
| 127 | +// Podemos obtener el nombre de la constante a partir de su valor: |
| 128 | +function getDia(dia) { |
| 129 | + for (let d in diasDeLaSemana) { |
| 130 | + if (diasDeLaSemana[d] === dia) { |
| 131 | + return d; |
| 132 | + } |
| 133 | + } |
| 134 | + return null; |
| 135 | +} |
| 136 | + |
| 137 | +console.log(getDia(1)); // LUNES |
| 138 | + |
| 139 | +function obtenerNombreDelDia(valor){ |
| 140 | + const clave = Object.keys(diasDeLaSemana).find(key => diasDeLaSemana[key] === valor); |
| 141 | + |
| 142 | + return clave || 'No existe'; |
| 143 | +} |
| 144 | + |
| 145 | +console.log(obtenerNombreDelDia(1)); // LUNES |
| 146 | +console.log(obtenerNombreDelDia(8)); // No existe |
| 147 | + |
| 148 | + |
| 149 | +/* DIFICULTAD EXTRA (opcional): |
| 150 | +* Crea un pequeño sistema de gestión del estado de pedidos. |
| 151 | +* Implementa una clase que defina un pedido con las siguientes características: |
| 152 | +* - El pedido tiene un identificador y un estado. |
| 153 | +* - El estado es un Enum con estos valores: PENDIENTE, ENVIADO, ENTREGADO y CANCELADO. |
| 154 | +* - Implementa las funciones que sirvan para modificar el estado: |
| 155 | +* - Pedido enviado |
| 156 | +* - Pedido cancelado |
| 157 | +* - Pedido entregado |
| 158 | +* (Establece una lógica, por ejemplo, no se puede entregar si no se ha enviado, etc...) |
| 159 | +* - Implementa una función para mostrar un texto descriptivo según el estado actual. |
| 160 | +* - Crea diferentes pedidos y muestra cómo se interactúa con ellos. |
| 161 | +*/ |
| 162 | + |
| 163 | +const estadosPedido = { |
| 164 | + PENDIENTE: 1, |
| 165 | + ENVIADO: 2, |
| 166 | + ENTREGADO: 3, |
| 167 | + CANCELADO: 4 |
| 168 | +} |
| 169 | + |
| 170 | +class Pedido { |
| 171 | + |
| 172 | + constructor(id){ |
| 173 | + this.id = id; |
| 174 | + this.estado = estadosPedido.PENDIENTE; |
| 175 | + } |
| 176 | + |
| 177 | + pedidoEnviado(){ |
| 178 | + if(this.estado === estadosPedido.PENDIENTE){ |
| 179 | + this.estado = estadosPedido.ENVIADO; |
| 180 | + } |
| 181 | + else{ |
| 182 | + console.log('El pedido no se puede enviar, ya ha sido enviado o cancelado'); |
| 183 | + } |
| 184 | + } |
| 185 | + |
| 186 | + pedidoEntregado(){ |
| 187 | + if(this.estado === estadosPedido.ENVIADO){ |
| 188 | + this.estado = estadosPedido.ENTREGADO; |
| 189 | + } |
| 190 | + else{ |
| 191 | + console.log('El pedido no se puede entregar, no ha sido enviado'); |
| 192 | + } |
| 193 | + } |
| 194 | + |
| 195 | + pedidoCancelado(){ |
| 196 | + if(this.estado != estadosPedido.ENTREGADO){ |
| 197 | + this.estado = estadosPedido.CANCELADO; |
| 198 | + } |
| 199 | + else{ |
| 200 | + console.log('El pedido no se puede cancelar ya se entrego'); |
| 201 | + } |
| 202 | + } |
| 203 | + |
| 204 | + mostrarEstado(){ |
| 205 | + let mensaje = ''; |
| 206 | + switch (this.estado) { |
| 207 | + case estadosPedido.PENDIENTE: |
| 208 | + mensaje = `El pedido ${this.id} está pendiente`; |
| 209 | + break; |
| 210 | + case estadosPedido.ENVIADO: |
| 211 | + mensaje = `El pedido ${this.id} ha sido enviado`; |
| 212 | + break; |
| 213 | + case estadosPedido.ENTREGADO: |
| 214 | + mensaje = `El pedido ${this.id} ha sido entregado`; |
| 215 | + break; |
| 216 | + case estadosPedido.CANCELADO: |
| 217 | + mensaje = `El pedido ${this.id} ha sido cancelado`; |
| 218 | + break; |
| 219 | + default: |
| 220 | + mensaje = 'Estado no válido'; |
| 221 | + } |
| 222 | + console.log(mensaje); |
| 223 | + } |
| 224 | +} |
| 225 | + |
| 226 | +const pedido1 = new Pedido(1); |
| 227 | +pedido1.mostrarEstado(); |
| 228 | +pedido1.pedidoEnviado(); |
| 229 | +pedido1.mostrarEstado(); |
| 230 | +pedido1.pedidoCancelado(); |
| 231 | +pedido1.mostrarEstado(); |
| 232 | +pedido1.pedidoEntregado(); |
| 233 | +pedido1.mostrarEstado(); |
| 234 | +console.log('-------------------------'); |
| 235 | +const pedido2 = new Pedido(2); |
| 236 | +pedido2.mostrarEstado(); |
| 237 | +pedido2.pedidoEntregado(); |
| 238 | +pedido2.mostrarEstado(); |
| 239 | +pedido2.pedidoCancelado(); |
| 240 | +pedido2.mostrarEstado(); |
| 241 | +pedido2.pedidoEnviado(); |
| 242 | +pedido2.mostrarEstado(); |
0 commit comments