@italico, creo que aún no has captado como funciona for/in. lo que el compañero @jp91 quiso decir con
valor[enumerable] sea verdadero es que el propio lenguaje haya permitido que una propiedad en particular se pueda enumerar. es algo que sucede transparentemente al programador, especialmente con las propiedades built-in del lenguaje. esta parte del lenguaje aún no la he visto bien pero en las últimas versiones del estandar de javascript (ECMA-262), el lenguaje permite al programador definir las características de una propiedad mediante un método
setter o getter. entre esas características, el programador puede definir si una propiedad es
enumerable asignando un boolean, donde
true (creo) indica que la propiedad se puede enumerar. a como lo entiendo, enumerar propiedades significa que tu puedas recopilar una lista de propiedades.
en el ejemplo que pones usando valores primitivos como propiedad (
array[false] por ejemplo), sucede otra cosa. en ese caso, el intérprete convierte ese valor a string y lo utiliza como el nombre de la propiedad. o sea,
array[false] es lo mismo que
array['false'].
Código:
var array = [true, false, null,'string'];
array[false] = 'boolean';
console.log( array[ 'false' ] ); // imprime 'boolean';
Cita: En esa modifificacion de tu script con prototipos, se perdio el orden (porque son enumerables) y descarto la llave "Pablo" por lo mismo...
ahí pablo no se descartó, recuerda que for/in lee los nombres de las propiedades, no los valores de las propiedades. en tu ejemplo, el
3 del resultado representa a Pablo.