10

Parte de la norma ECMA Creo que es que las consolas Javascript mostrarán los objetos como matrices cuando los objetos sean similares a una matriz.¿La consola de Google Chrome no está mostrando correctamente los objetos tipo array cuando se obtienen/configuran sus indexadores?

Tales como: ["hello", "world"] para un objeto que contiene cadenas que están indexadas numéricamente.

El comportamiento de tipo matriz se define como una propiedad de longitud y un método de empalme que está presente en el objeto, así como las propiedades indexadas numéricamente.

Muchos de nosotros probablemente ya hemos visto esto con jQuery en el pasado.

He intentado aprovechar este comportamiento y lo considero deseable. Sin embargo, tengo el requisito adicional de que mis índices usen getters/setters para configurarlos de modo que pueda hacer un procesamiento adicional cuando se modifiquen.

Sin embargo cuando hago esto la matriz anterior se en lugar prestados como:

[indefinido × 2]

Sin embargo, el objeto se comporta de otra manera exactamente el mismo como un simple ejemplo.

ver este violín para una explicación mucho mejor: http://jsfiddle.net/5YgAv/

por lo que ver? Dos ejemplos muy similares, sin embargo, la presencia del captador se ha roto en la consola.

He estado depurando el último código fuente de Chromium y parece que Chrome inserta un mensaje en la consola que contiene esencialmente la función getter. Sin embargo, no hay forma de modificar el código fuente de la consola para que pueda invocar la función y obtener el valor. Si eso fuera posible, entonces podríamos modificar las herramientas de desarrollador para manejar getters y setters correctamente.

Lo que me gustaría saber es si alguien tiene alguna idea sobre este pequeño error interesante o cómo podría solucionarse mejor antes de que lo archive como un error con el equipo de Chrome que hace tiempo que se olvidó y enterró en las profundidades de Google. De hecho, me gustaría arreglar esto yo mismo de una forma u otra.

También estoy abierto a una solución que sea elegante y que me permita realizar un procesamiento especial cuando se modifique cualquiera de las propiedades de mi objeto tipo array.

Ayúdame Obi-Stackoverflow-Kenobi, ¡eres mi única esperanza!

[Ryan]

+3

consolas de JavaScript no son parte del estándar de ES, y tampoco lo es hay "comportamiento tipo array". ¿Realmente Chrome necesita un método de empalme? Opera, por ejemplo, muestra todo con una lista de propiedades de "longitud", como. – Bergi

+0

¡Eso es realmente perspicaz gracias! Miré brevemente el estándar y estaba en la opinión de otra pregunta de stackoverflow. Gracias por eso. La pregunta sigue en pie, sin embargo, las herramientas de desarrollo de Chrome se muestran incorrectamente de acuerdo a cómo se muestra normalmente Chrome. –

Respuesta

2

Si bien esto no responde a la pregunta de por qué Chrome no escribirá la matriz como una matriz, hay una manera de "engañar" Chrome para que lo hiciera. Afortunadamente para nosotros, es súper simple.

  1. sobrescribir la función toString del objeto, volviendo sus datos variables
  2. Al iniciar sesión su matriz, ingrese como miMatriz.Encadenar();

Ver este jsFiddle: http://jsfiddle.net/YXwxS/

Mientras tanto, voy a seguir investigando esto porque es un problema interesante :)

+0

Después de un poco más de excavación, parece que las herramientas de desarrollo de Chrome no están realmente actuando como se espera al acceder a una propiedad. Es como si no respetasen la función get y, en cambio, persiguen un valor que aún no se ha establecido porque no se ha llamado a la función get. Tendré que buscar en la fuente para verificar esto, pero eso sería mi suposición :) Lo anterior es al menos una solución que funciona, y es simple :) –

Cuestiones relacionadas