un nuevo objeto creado a partir de un objeto completamente personalizado (especialmente uno creado a partir del objeto null
, que es básicamente un objeto personalizado sin miembros) puede comportarse de maneras inesperadas. Esto es especialmente cierto cuando se depura, ya que las funciones de utilidad comunes de conversión/detección de propiedades de objeto pueden generar errores o perder información (especialmente si se usan trampas de error silenciosas que ignoran los errores). Por ejemplo, aquí hay dos objetos:
como se muestra arriba, todo parece normal hasta ahora., Sin embargo, al intentar realmente usar estos objetos, sus diferencias se hacen evidentes rápidamente:
> "oco is: " + oco // shows "oco is: "> "ocn is: " + ocn // throws error: Cannot convert object to primitive value
probar solo algunas de las muchas funciones integradas más básicas muestra la magnitud del problema más claramente:
como se dijo, estas diferencias pueden hacer que la depuración incluso problemas que parecen simples se pierdan rápidamente. Por ejemplo:
una simple función de depuración común:
resultados no tan simples: (especialmente si la captura silenciosa de errores había ocultado los mensajes de error)
(Pero si el mismo objeto se crea en un orden diferente — al menos en algunas implementaciones.,..)
tenga en cuenta que tal orden diferente puede surgir estáticamente a través de codificaciones fijas dispares como aquí, pero también dinámicamente a través de cualquier orden que cualquier propiedad que agregue ramas de código realmente se ejecute en tiempo de ejecución, ya que depende de las entradas y/o variables aleatorias. Por otra parte, el orden de iteración real no está garantizado sin importar cuáles sean los miembros de la orden que se agreguen.
tenga en cuenta, también, que el uso de objeto.entries() en un objeto creado a través de Object.create () hará que se devuelva un array vacío.,
var obj = Object.create({ a: 1, b: 2 });> console.log(Object.entries(obj)); // shows ""
algunas No-soluciones
una buena solución para los métodos-objeto faltantes no es inmediatamente aparente.,
agregar el método-objeto faltante directamente desde el objeto-estándar no funciona:
agregar el método-objeto faltante directamente al «prototipo» de nuevo objeto tampoco funciona, ya que el nuevo objeto no tiene un prototipo real (que es realmente la causa de todos estos problemas) y uno no se puede agregar directamente:
agregar el método-objeto faltante usando el objeto-estándar como prototipo de nuevo objeto tampoco funciona:
h4>
de nuevo, agregar el método objeto que falta directamente desde el objeto estándar no funciona., Sin embargo, agregar el método genérico directamente, hace:
sin embargo, establecer el prototipo genérico como el prototipo del nuevo objeto funciona aún mejor:
(Además de todas las funciones relacionadas con cadenas mostradas anteriormente, esto también agrega:)
como se muestra, los objetos modificados de esta manera ahora se parecen mucho a los objetos ordinarios.