2010-03-30 16 views
8

En un article en yuiblog Douglas Crockford dice que la instrucción for in iterará sobre los métodos de un objeto. ¿Por qué el siguiente código no produce ["a", "b", "c", "d", "toString"]? ¿No son .toString() y otros métodos miembros de my_obj?¿JavaScript para en iterar itera sobre los métodos?

Object.prototype.toString = function(){return 'abc'} 
Object.prototype.d = 4; 

my_obj = { 
    'a':1, 
    'b':2, 
    'c':3 
} 

a = [] 
for (var key in my_obj) { 
    a.push(key) 
} 

console.log(a) // prints ["a", "b", "c", "d"] 

Respuesta

12

Todas las propiedades definidas por el usuario son enumerables, incluidas las propiedades heredadas del prototipo. Las propiedades nativas integradas no lo son. toString() es uno de ellos. Vea aquí https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Statements/For...in

Editar: Mi interpretación de "Sin embargo, el bucle se repetirá durante todas las propiedades definidas por el usuario (incluso las que se sobrescribe propiedades integradas)" es que las propiedades que se sobrescriben directamente en el objeto convertido en enumerable. No sobrescribir en el prototipo en sí. Eso significa:

var my_obj = {a: 1, b: 2, c: 3}; 
my_obj.toString = function() {return 'abc';}; 

a = [] 
for (var key in my_obj) { 
    a.push(key) 
} 

console.log(a) // prints ["a", "b", "c", "toString"] 
+2

Sí, 'Object.prototype.toString.propertyIsEnumerable() == false' – CMS

+0

Del documento se conectó: "Un bucle for ... in no iterar sobre propiedades integradas Estos. incluir todos los métodos incorporados de objetos, como el método indexOf de String o el método ObjectS toString. Sin embargo, el ciclo iterará sobre todas las propiedades definidas por el usuario (incluidas las que sobrescriban las propiedades integradas) ". ¿Por qué el documento dice que "se incluye cualquiera que sobrescriba las propiedades incorporadas" si en mi ejemplo .toString() no se sobrescribe? – hekevintran

+0

@hekevintran: actualicé mi respuesta. –

2

for..in itera sobre las propiedades definidas por el usuario. Si cambia el código para:

Object.prototype.foo = function() { return 'abc'; }; 

Entonces

console.log(a); 

salida será:

["a", "b", "c", "foo", "d"] 

Como Chetan Sastry señaló señaló, toString se trata de manera diferente, ya que es un built-in, propiedad nativa.

Cuestiones relacionadas