Command Palette

Search for a command to run...

Trap ownKeys: Interceptando la Enumeración de Propiedades en Proxy

Domina el trap ownKeys de Proxy para controlar qué propiedades son enumeradas, ocultar propiedades internas y personalizar el orden de enumeración de objetos.

Lectura: 14 min
Nivel: Intermedio

TL;DR - Resumen rápido

  • El trap ownKeys intercepta operaciones de enumeración como Object.keys(), for...in y Object.getOwnPropertyNames()
  • ownKeys debe devolver un array de strings o Symbols que representan las propiedades enumerables
  • Puedes usar ownKeys para ocultar propiedades internas de la enumeración
  • ownKeys permite agregar propiedades virtuales que aparecen en la enumeración
  • El trap ownKeys no afecta el acceso directo a las propiedades, solo su enumeración

Introducción al Trap ownKeys

El trap ownKeys se ejecuta cuando se realizan operaciones de enumeración sobre un objeto, como Object.keys(), for...in, Object.getOwnPropertyNames(), Object.getOwnPropertySymbols() y Reflect.ownKeys(). Este trap te permite controlar qué propiedades son visibles en estas operaciones, lo que es útil para ocultar propiedades internas, agregar propiedades virtuales o controlar el orden de enumeración.

Es importante entender que ownKeys solo afecta la enumeración de propiedades, no el acceso directo a ellas. Una propiedad puede estar oculta de la enumeración pero seguir siendo accesible directamente si conoces su nombre. Para un control completo, debes combinar ownKeys con otros traps como get, has y deleteProperty.

  • Ocultar propiedades internas y privadas de la enumeración
  • Agregar propiedades virtuales que aparecen como si existieran en el objeto
  • Controlar el orden en que se enumeran las propiedades
  • Implementar filtros dinámicos basados en el contexto o permisos
  • Crear APIs más limpias ocultando detalles de implementación

Diferencia con has y getOwnPropertyDescriptor

El trap ownKeys controla QUÉ propiedades aparecen en la enumeración, mientras que has controla si una propiedad existe según el operador in, y getOwnPropertyDescriptor controla los atributos de una propiedad específica. Para ocultar completamente una propiedad, debes combinar ownKeys con has y getOwnPropertyDescriptor.

Trap ownKeys: Interceptando Enumeración

El trap ownKeys se ejecuta cuando se realizan operaciones de enumeración sobre el Proxy. Recibe un solo parámetro: el target (el objeto original). El trap debe devolver un array de strings o Symbols que representan las propiedades que deben ser enumeradas.

El array devuelto por ownKeys debe incluir todas las propiedades enumerable del target, más cualquier propiedad virtual que quieras agregar. Si omites una propiedad enumerable del target, JavaScript lanzará un TypeError porque el array devuelto no coincide con las propiedades del objeto.

Uso Básico del Trap ownKeys

Este ejemplo muestra cómo usar el trap ownKeys para interceptar todas las operaciones de enumeración y agregar logging. El trap usa Reflect.ownKeys para obtener las propiedades del target original y las devuelve con logging.

ownkeys-basico.js
Loading code...

El trap ownKeys intercepta todas las operaciones de enumeración. En este ejemplo, registramos qué operación se está realizando y luego usamos Reflect.ownKeys para obtener las propiedades del target original.

Filtrar Propiedades

Puedes usar el trap ownKeys para filtrar qué propiedades aparecen en la enumeración. Esto es útil para ocultar propiedades internas, propiedades de configuración o propiedades que no deberían ser visibles para el código que consume el objeto.

filtrar-propiedades.js
Loading code...

Este ejemplo muestra cómo filtrar propiedades usando el trap ownKeys. Las propiedades que empiezan con un guion bajo (_password, _token) no aparecen en la enumeración, aunque siguen siendo accesibles directamente.

Encapsulación con ownKeys

El trap ownKeys es una forma de implementar encapsulación en JavaScript. Al ocultar propiedades internas de la enumeración, creas una API más limpia y evitas que el código externo dependa de detalles de implementación. Sin embargo, recuerda que esto no es seguridad real: las propiedades siguen existiendo y pueden ser accedidas si se conoce su nombre.

Ocultar Propiedades de la Enumeración

Una de las aplicaciones más comunes del trap ownKeys es ocultar propiedades internas de la enumeración. Esto es útil para implementar encapsulación, crear APIs más limpias y evitar que el código externo dependa de detalles de implementación.

propiedades-ocultas-ownkeys.js
Loading code...

Este ejemplo muestra cómo ocultar propiedades internas usando el trap ownKeys. Las propiedades que empiezan con un guion bajo no aparecen en Object.keys(), for...in ni otras operaciones de enumeración.

Ocultar vs Eliminar

Ocultar una propiedad con ownKeys es diferente de eliminarla. La propiedad sigue existiendo en el objeto y puede ser accedida directamente si conoces su nombre. Para eliminar completamente una propiedad, usa el operador delete. Para ocultar una propiedad de la enumeración pero mantenerla accesible, usa ownKeys.

Propiedades Virtuales en Enumeración

Puedes usar el trap ownKeys para agregar propiedades virtuales que aparecen en la enumeración como si existieran en el objeto. Esto es útil para crear propiedades computadas que se enumeran junto con las propiedades reales.

propiedades-virtuales-ownkeys.js
Loading code...

Este ejemplo muestra cómo agregar propiedades virtuales a la enumeración usando el trap ownKeys. Las propiedades fullName y ageInDays se calculan dinámicamente y aparecen en la enumeración junto con las propiedades reales.

Control del Orden de Propiedades

El trap ownKeys también te permite controlar el orden en que se enumeran las propiedades. Por defecto, JavaScript enumera las propiedades en el orden en que fueron creadas, pero puedes cambiar este orden devolviendo las propiedades en el orden que desees.

orden-propiedades.js
Loading code...

Este ejemplo muestra cómo controlar el orden de enumeración de propiedades usando el trap ownKeys. Las propiedades se ordenan alfabéticamente en lugar de seguir el orden de creación.

Mejor Práctica: Orden Determinista

Para garantizar un orden determinista de enumeración, siempre ordena las propiedades en el trap ownKeys. Esto hace el comportamiento más predecible y evita bugs que dependen del orden de creación de propiedades, especialmente en aplicaciones que serializan objetos a JSON.

Errores Comunes

Al trabajar con el trap ownKeys, hay varios errores comunes que debes evitar. Estos errores pueden causar comportamientos inesperados, bugs difíciles de debuggear o errores de ejecución.

Error: No Devolver un Array

El trap ownKeys debe devolver un array de strings o Symbols. Si devuelves cualquier otro tipo de valor, JavaScript lanzará un TypeError.

error-no-devolver-array.js
Loading code...

Este ejemplo muestra el problema de no devolver un array en el trap ownKeys. Si el trap ownKeys no devuelve un array, JavaScript lanza un TypeError porque espera recibir un array de propiedades.

Por Qué Devolver un Array

El trap ownKeys debe devolver un array porque las operaciones de enumeración como Object.keys() y for...in esperan iterar sobre una lista de propiedades. Si devuelves cualquier otro tipo de valor, JavaScript no puede realizar la enumeración y lanza un error.

Error: Inconsistencia con Propiedades Enumerables

Un error común es devolver un array en ownKeys que no incluye todas las propiedades enumerable del target. JavaScript lanza un TypeError si el array devuelto no coincide con las propiedades enumerable del objeto.

error-inconsistencia.js
Loading code...

Este ejemplo muestra el problema de la inconsistencia en ownKeys. Si devuelves un array que no incluye todas las propiedades enumerable del target, JavaScript lanza un TypeError porque el array no coincide con las propiedades del objeto.

Error: No Combinar con Otros Traps

Otro error común es usar ownKeys sin combinarlo con otros traps como has y getOwnPropertyDescriptor. Esto puede causar inconsistencias donde una propiedad aparece en la enumeración pero no puede ser accedida, o viceversa.

error-no-combinar-traps.js
Loading code...

Este ejemplo muestra el problema de no combinar ownKeys con otros traps. Si ocultas una propiedad con ownKeys pero no con has, la propiedad aparecerá en el operador in aunque no aparezca en Object.keys().

Resumen: Trap ownKeys

Conceptos principales:

  • El trap ownKeys intercepta operaciones de enumeración como Object.keys() y for...in
  • ownKeys debe devolver un array de strings o Symbols
  • Puedes usar ownKeys para ocultar propiedades internas de la enumeración
  • ownKeys permite agregar propiedades virtuales a la enumeración
  • El trap ownKeys no afecta el acceso directo a las propiedades

Mejores prácticas:

  • Usa siempre Reflect.ownKeys dentro del trap para obtener las propiedades del target
  • Combina ownKeys con has y getOwnPropertyDescriptor para ocultar completamente propiedades
  • Ordena las propiedades en ownKeys para garantizar un orden determinista
  • Usa convenciones de nombres para propiedades ocultas (prefijo _)
  • Asegúrate de devolver un array que incluya todas las propiedades enumerable del target