¿Cómo enumero las propiedades de un objeto JavaScript? [duplicar]

Resuelto davenpcj asked hace 16 años • 14 respuestas

¿Cómo enumero las propiedades de un objeto JavaScript?

De hecho, quiero enumerar todas las variables definidas y sus valores, pero aprendí que definir una variable en realidad crea una propiedad del objeto de ventana.

davenpcj avatar Sep 18 '08 01:09 davenpcj
Aceptado

Suficientemente simple:

for(var propertyName in myObject) {
   // propertyName is what you want
   // you can get the value like this: myObject[propertyName]
}

Ahora bien, no obtendrás variables privadas de esta manera porque no están disponibles.


EDITAR: @bitwiseplatypus tiene razón en que, a menos que use el hasOwnProperty()método, obtendrá propiedades heredadas; sin embargo, no sé por qué alguien familiarizado con la programación orientada a objetos esperaría menos. Normalmente, alguien que menciona esto ha sido sometido a las advertencias de Douglas Crockford al respecto, lo que todavía me confunde un poco. Nuevamente, la herencia es una parte normal de los lenguajes OO y, por lo tanto, es parte de JavaScript, a pesar de ser prototípico.

Ahora bien, dicho esto, hasOwnProperty() es útil para filtrar, pero no necesitamos hacer sonar una advertencia como si hubiera algo peligroso en obtener propiedades heredadas.

EDITAR 2: @bitwiseplatypus plantea la situación que ocurriría si alguien agregara propiedades/métodos a sus objetos en un momento posterior al que escribió originalmente sus objetos (a través de su prototipo), si bien es cierto que esto podría causar un comportamiento inesperado. , Personalmente no veo que ese sea mi problema del todo. Sólo es una cuestión de opinión. Además, ¿qué pasa si diseño cosas de tal manera que uso prototipos durante la construcción de mis objetos y aún así tengo un código que itera sobre las propiedades del objeto y quiero todas las propiedades heredadas? Yo no usaría hasOwnProperty(). Luego, digamos que alguien agrega nuevas propiedades más adelante. ¿Es culpa mía si las cosas se portan mal en ese momento? No me parece. Creo que es por eso que jQuery, como ejemplo, ha especificado formas de ampliar su funcionamiento (vía jQuery.extendy jQuery.fn.extend).

Jason Bunting avatar Sep 17 '2008 18:09 Jason Bunting

Utilice un for..inbucle para enumerar las propiedades de un objeto, pero tenga cuidado. La enumeración devolverá propiedades no sólo del objeto que se enumera, sino también de los prototipos de cualquier objeto principal.

var myObject = {foo: 'bar'};

for (var name in myObject) {
  alert(name);
}

// results in a single alert of 'foo'

Object.prototype.baz = 'quux';

for (var name in myObject) {
  alert(name);
}

// results in two alerts, one for 'foo' and one for 'baz'

Para evitar incluir propiedades heredadas en su enumeración, verifique hasOwnProperty():

for (var name in myObject) {
  if (myObject.hasOwnProperty(name)) {
    alert(name);
  }
}

Editar: no estoy de acuerdo con la afirmación de JasonBunting de que no debemos preocuparnos por enumerar las propiedades heredadas. Es peligroso enumerar propiedades heredadas que no espera, porque puede cambiar el comportamiento de su código.

No importa si este problema existe en otros idiomas; el hecho es que existe, y JavaScript es particularmente vulnerable ya que las modificaciones al prototipo de un objeto afectan a los objetos secundarios incluso si la modificación tiene lugar después de la creación de instancias.

Es por eso que JavaScript proporciona hasOwnProperty(), y es por eso que debes usarlo para asegurarte de que el código de terceros (o cualquier otro código que pueda modificar un prototipo) no rompa el tuyo. Aparte de agregar algunos bytes adicionales de código, no hay ningún inconveniente en usar hasOwnProperty().

Ryan Grove avatar Sep 17 '2008 18:09 Ryan Grove