Definición y Configuración de Propiedades
Para definir o modificar propiedades en un objeto con un control preciso sobre sus características, utilizamos Object.defineProperty(). Las propiedades en JavaScript pueden ser de datos o de acceso.
- objeto: El objeto sobre el cual se define la propiedad.
- propiedad: El nombre de la propiedad a crear o modificar.
- descriptor: Un objeto que cofnigura el comportamiento de la propiedad:
value: El valor asociado a la propiedad.writable: Indica si el valer puede ser modificado mediante asignación.enumerable: Determina si la propiedad aparece en buclesfor...ino métodos de iteración.configurable: Define si la propiedad puede ser eliminada o si sus atributos pueden ser alterados nuevamente.
const usuario = {};
Object.defineProperty(usuario, 'idInterno', {
value: 9921,
writable: false,
enumerable: false,
configurable: false
});
Para inspeccionar la configuración actual de una propiedad específica, empleamos Object.getOwnPropertyDescriptor(), el cual recibe el objeto y el nombre de la propiedad como argumentos y devuelve su descriptor.
Fusión y Copia de Objetos
El método Object.assign() permite copiar los valores de todas las propiedades enumerables de uno o más objetos fuente a un objeto destino, retornando este último. Es fundamental para realizar copias superficiales (shallow copies).
const configuracionBase = { tema: 'oscuro', idioma: 'es' };
const preferenciasUsuario = { idioma: 'en', notificaciones: true };
const configuracionFinal = Object.assign({}, configuracionBase, preferenciasUsuario);
console.log(configuracionFinal);
// Resultado: { tema: 'oscuro', idioma: 'en', notificaciones: true }
Extracción de Claves, Valores y Entradas
JavaScript ofrece múltiples formas de iterar o extraer información de las propiedades de un objeto, dependiendo de si son enumerables, si son de tipo Symbol o si pertenecen a la instencia directa.
Propiedades Enumerables de tipo String
Los métodos Object.keys(), Object.values() y Object.entries() devuelven arreglos con las claves, los valores o los pares [clave, valor] respectivamente. Estos métodos ignoran propiedades heredadas, no enumerables y de tipo Symbol.
const producto = { nombre: 'Teclado', precio: 45, stock: 120 };
console.log(Object.keys(producto));
// ['nombre', 'precio', 'stock']
console.log(Object.values(producto));
// ['Teclado', 45, 120]
console.log(Object.entries(producto));
// [['nombre', 'Teclado'], ['precio', 45], ['stock', 120]]
Propiedades No Enumerables y Symbols
Si necesitamos acceder a propiedades que no son enumerables, utilizamos Object.getOwnPropertyNames(). Este método devuelve un arreglo con los nombres de las propiedades, pero ignora las claves de tipo Symbol.
const claveOculta = Symbol('secreto');
const sistema = { version: '1.0.4' };
Object.defineProperty(sistema, 'estado', { value: 'activo', enumerable: false });
sistema[claveOculta] = 'token-xyz';
console.log(Object.getOwnPropertyNames(sistema));
// ['version', 'estado']
Para obtener exclusivamente las claves de tipo Symbol, recurrimos a Object.getOwnPropertySymbols().
const simboloA = Symbol('alfa');
const simboloB = Symbol('beta');
const registro = { dato: 10 };
registro[simboloA] = 'A';
registro[simboloB] = 'B';
console.log(Object.getOwnPropertySymbols(registro));
// [Symbol(alfa), Symbol(beta)]
Todas las Propiedades Propias
Cuando requerimos un listado exhaustivo de todas las claves propias del objeto (tanto String como Symbol, enumerables o no), la solución ideal es Reflect.ownKeys().
const miSimbolo = Symbol('id');
const entidad = { tipo: 'usuario' };
Object.defineProperty(entidad, 'creado', { value: Date.now(), enumerable: false });
entidad[miSimbolo] = 884;
console.log(Reflect.ownKeys(entidad));
// ['tipo', 'creado', Symbol(id)]