10

Parte dello standard ECMA Credo che le console Javascript visualizzeranno gli oggetti come matrici quando gli oggetti sono come una matrice.La console di Google Chrome non visualizza correttamente gli oggetti tipo array quando i loro indicizzatori sono basati su get/set?

Ad esempio: ["ciao", "mondo"] per un oggetto contenente stringhe che sono indicizzate numericamente.

Il comportamento di tipo array è definito come una proprietà di lunghezza e un metodo di giunzione presente sull'oggetto, nonché proprietà indicizzate numericamente.

Molti di noi hanno probabilmente visto questo con jQuery in passato.

Ho cercato di sfruttare questo comportamento e ritenerlo desiderabile. Tuttavia, ho il requisito aggiuntivo che i miei indici utilizzino getter/setter per impostarli in modo da poter eseguire qualche elaborazione aggiuntiva quando vengono modificati.

Tuttavia quando faccio questo la matrice sopra è invece reso come:

[indefinito × 2]

Tuttavia l'oggetto si comporta diversamente esattamente come un semplice esempio.

Vai a questa Fiddle per una spiegazione di gran lunga migliore: http://jsfiddle.net/5YgAv/

Quindi, vedete? Due esempi molto simili, tuttavia la presenza del getter lo ha rotto nella console.

Ho eseguito il debug del più recente codice sorgente Chromium e sembra che Chrome abbia inviato un messaggio alla console che contiene essenzialmente la funzione getter. Tuttavia non c'è modo di modificare il codice sorgente della console in modo che possa richiamare la funzione e ottenere il valore. Se fosse possibile, potremmo modificare gli strumenti di sviluppo per gestire correttamente getter e setter.

Quello che mi piacerebbe sapere è se qualcuno ha qualche idea di questo piccolo bug interessante o di come potrebbe essere risolto nel modo migliore prima di archiviarlo come un bug con il team di Chrome da lungo tempo dimenticato e sepolto nel profondo di Google. Mi piacerebbe davvero aggiustarmelo in un modo o nell'altro.

Sono anche aperto a una soluzione che è elegante e mi consente di eseguire alcune elaborazioni speciali quando si modificano le proprietà sul mio oggetto tipo array.

Aiutami Obi-Stackoverflow-Kenobi, sei la mia unica speranza!

[Ryan]

+3

console JavaScript non fanno parte dello standard ES, e nessuno dei due è c'è "comportamento di tipo array". Chrome ha davvero bisogno di un metodo di giunzione? Opera ad esempio visualizza tutto con una lista di proprietà di "lunghezza". – Bergi

+0

Questo è un grazie davvero interessante! Avevo guardato brevemente lo standard e stavo per formulare l'opinione di un'altra domanda di stackoverflow. Grazie per quello. La domanda è ancora valida, gli strumenti di sviluppo di Chrome vengono visualizzati in modo errato in base a come Chrome viene normalmente visualizzato! –

risposta

2

Anche se questo non risponde alla domanda del perché Chrome non scrivere l'array come un array, c'è un modo per Chrome "trucco" nel farlo. Fortunatamente per noi, è super semplice.

  1. sovrascrivere la funzione di toString del vostro oggetto, restituendo i dati variabili
  2. Quando si accede la matrice, accedere come myArray.accordare();

Vedi questo jsFiddle: http://jsfiddle.net/YXwxS/

Nel frattempo, ho intenzione di continuare la ricerca di questo, perché è un problema interessante :)

+0

Dopo aver scavato un po 'di più, sembra che gli strumenti di sviluppo di Chrome non agiscano in realtà come ci si aspetterebbe quando si accede a una proprietà. È come se non rispettassero la funzione get e stessero andando a cercare un valore che non è stato ancora impostato perché la funzione get non è stata chiamata. Dovrò cercare nella fonte per verificarlo, ma questa sarebbe la mia ipotesi :) Quanto sopra è almeno una soluzione che funziona, ed è semplice :) –