Métodos Estáticos Esenciales de Object y Reflect en JavaScript

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 bucles for...in o 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)]

Etiquetas: JavaScript object Reflect PropertyDescriptors ecmascript

Publicado el 10-14 10:01