Me pregunto. He extendido el objeto Array javascript usando su prototipo de la siguiente manera:

<html>
<head>
</head>
<body>
<script type="text/javascript">
  function SomeMethod(){
  alert('Hello');
  }
  if(typeof Array.prototype.SomeMethod ==='undefined' ){
    Array.prototype.SomeMethod = SomeMethod;
  }
  var ax=new Array("A","B","C");
  for(var i in ax){
    document.write(ax[i]);
  }
</script>

</body>
</html>

El resultado será:

ABCfunction SomeMethod() { alert("Hello"); } 

EDITAR: Aunque ya encontré la respuesta, siento la necesidad de agregar más información para que sea más clara para los demás.

0
Eugeniu Torica 5 ago. 2009 a las 20:52

3 respuestas

La mejor respuesta

for..in itera sobre las propiedades (no integradas) de un objeto. No lo use para recorrer en iteración una matriz. Simplemente use un bucle for regular.

Lea este enlace https://developer.mozilla.org /en/Core_JavaScript_1.5_Reference/Statements/for...in#Description

3
Chetan Sastry 5 ago. 2009 a las 16:57

Crockford hace un gran trabajo al explicar esto en su sitio y en sus videos. Parece que está abusando del tipo Array al usarlo como una tabla hash. En cuyo caso deberá hacer lo siguiente

De Crockford:

JavaScript tiene muy buenas comodidades de notación para manipular tablas hash.

var myHashtable = {};

Esta declaración crea una nueva tabla hash y la asigna a una nueva variable local. JavaScript se escribe libremente, por lo que no usamos nombres de tipo en las declaraciones. Utilizamos la notación de subíndice para agregar, reemplazar o recuperar elementos en la tabla hash.

myHashtable["name"] = "Carl Hollywood";

También hay una notación de puntos que es un poco más conveniente.

myHashtable.city = "Anytown";

La notación de puntos se puede utilizar cuando el subíndice es una constante de cadena en forma de un identificador legal. Debido a un error en la definición del lenguaje, las palabras reservadas no se pueden usar en la notación de puntos, pero se pueden usar en la notación de subíndice.

Puede ver que la notación de tabla hash de JavaScript es muy similar a las anotaciones de objetos y matrices de Java. JavaScript lleva esto mucho más lejos: los objetos y las tablas hash son lo mismo, por lo que podría haber escrito

var myHashtable = new Object();

y el resultado hubiera sido exactamente el mismo.

Hay una capacidad de enumeración integrada en la declaración for.

for (var n in myHashtable) {
    if (myHashtable.hasOwnProperty(n)) {
        document.writeln("<p>" + n + ": " + myHashtable[n] + "</p>");
    }
}

Creo que el código jquery .each hace esto por usted, pero no estoy 100% seguro.

Si está utilizando una matriz real y desea utilizarla correctamente, debe hacerlo

for (var i = 0; i < myArray.length; i++)
{
    alert(myArray[i]);
}
1
Allen Rice 5 ago. 2009 a las 17:10

Una pregunta sería útil ;-)

¿Supongo que no quieres que aparezca la propiedad prototipo? JS no le permite establecer "DontEnum" en las propiedades que agrega al prototipo, por lo que debe verificar si la matriz tiene la propiedad o si es una propiedad de su prototipo:

for(var i in ax) {
    if (a.hasOwnProperty(i)) {
        document.write(ax[i]);
    }
}

Aunque para iterar sobre una matriz, en realidad no deberías usar for...in, ya que es para iterar sobre las propiedades de un objeto, en lugar de los elementos de una matriz.

2
NickFitz 5 ago. 2009 a las 17:01