Lección 34: Métodos Estáticos de Objetos
🧠 Concepto
Section titled “🧠 Concepto”JavaScript proporciona métodos estáticos en Object para trabajar con objetos de forma más eficiente.
Object.keys(), Object.values(), Object.entries()
Section titled “Object.keys(), Object.values(), Object.entries()”Devuelven arrays con las propiedades, valores o pares clave-valor de un objeto:
const usuario = { nombre: 'Ana', edad: 28, ciudad: 'Madrid'};
console.log(Object.keys(usuario)); // ['nombre', 'edad', 'ciudad']console.log(Object.values(usuario)); // ['Ana', 28, 'Madrid']console.log(Object.entries(usuario));// [['nombre', 'Ana'], ['edad', 28], ['ciudad', 'Madrid']]Object.assign()
Section titled “Object.assign()”Copia propiedades de uno o más objetos fuente a un objeto destino:
const destino = { a: 1 };const fuente1 = { b: 2, c: 3 };const fuente2 = { d: 4 };
Object.assign(destino, fuente1, fuente2);console.log(destino); // { a: 1, b: 2, c: 3, d: 4 }
// Clonar un objetoconst original = { x: 10, y: 20 };const copia = Object.assign({}, original);console.log(copia); // { x: 10, y: 20 }Object.freeze() vs Object.seal()
Section titled “Object.freeze() vs Object.seal()”const config = { tema: 'oscuro', idioma: 'es' };
Object.freeze(config);config.tema = 'claro'; // No hace nada (ni modifica ni error en strict)config.nuevaProp = 'test'; // No hace nadadelete config.idioma; // No hace nadaconsole.log(config); // { tema: 'oscuro', idioma: 'es' }console.log(Object.isFrozen(config)); // true
const config2 = { tema: 'claro', idioma: 'en' };Object.seal(config2);config2.tema = 'oscuro'; // Sí funciona (modificar propiedades existentes)config2.nuevaProp = 'test'; // No funciona (no añadir)delete config2.idioma; // No funciona (no eliminar)console.log(config2); // { tema: 'oscuro', idioma: 'en' }console.log(Object.isSealed(config2)); // truehasOwnProperty()
Section titled “hasOwnProperty()”Verifica si una propiedad existe en el objeto (no en su prototipo):
const obj = { a: 1 };console.log(obj.hasOwnProperty('a')); // trueconsole.log(obj.hasOwnProperty('toString')); // false (viene del prototipo)💻 Ejemplo
Section titled “💻 Ejemplo”// Iterar sobre objetosconst puntuaciones = { Ana: 95, Luis: 88, Carlos: 72 };
// for...in itera sobre propiedades enumerables (incluyendo prototipo)for (let nombre in puntuaciones) { if (puntuaciones.hasOwnProperty(nombre)) { console.log(`${nombre}: ${puntuaciones[nombre]}`); }}
// Con Object.entries() es más limpiofor (const [nombre, puntuacion] of Object.entries(puntuaciones)) { console.log(`${nombre}: ${puntuacion}`);}
// Transformar objeto a array de objetosconst usuariosArray = Object.entries(puntuaciones).map(([nombre, puntuacion]) => ({ nombre, puntuacion}));console.log(usuariosArray);// [{ nombre: 'Ana', puntuacion: 95 }, ...]⚠️ Nota
Section titled “⚠️ Nota”Object.freeze() es superficial (shallow). Los objetos anidados siguen siendo mutables:
const obj = { anidado: { a: 1 } };Object.freeze(obj);obj.anidado.a = 2; // Sí funcionaconsole.log(obj.anidado.a); // 2Usa Object.keys() + forEach() para iterar propiedades. Usa Object.entries() cuando necesites clave y valor. Usa Object.assign({}, obj) o spread operator para clonar. Reserva freeze para configuraciones inmutables y seal para objetos con estructura fija pero valores modificables.
📝 Ejercicio
Section titled “📝 Ejercicio”Escribe una función llamada filtrarPorValor que reciba un objeto y un número mínimo, y devuelva un nuevo objeto solo con las propiedades cuyo valor sea >= al mínimo.
function filtrarPorValor(objeto, minimo) { // Usa Object.entries() y filter}
const datos = { a: 10, b: 5, c: 20, d: 3 };console.log(filtrarPorValor(datos, 10)); // { a: 10, c: 20 }