2010-03-24 12 views

Respuesta

42

Bueno, en javascript, cualquier objeto es un objeto expando. Lo que significa es, como el artículo cubre, que cada vez que intente acceder a una propiedad se creará automáticamente.

var myObj = {}; // completely empty object 
myObj.myProp = 'value'; 

el momento en que se asigna un valor myProp, la propiedad myProp se crea de forma dinámica, apesar de que no existía antes. En muchos otros lenguajes, como C#, esto normalmente no es posible (de hecho, C# acaba de habilitar el soporte de objetos expandidos también, pero eso es además del punto). Para acceder a una propiedad en una clase normal en C#, debe especificar en la clase que sí tiene esta propiedad.

No del todo correcto. Ver el comentario de npup a continuación para aclaración.

+46

No .. si simplemente "intenta acceder" a una propiedad, por supuesto, no se "creará automáticamente". Puedes empujar una propiedad cuando quieras, pero eso no es lo mismo. Solo llegar a la 'foo.bar' que no existe y recuperar' undefined' no hace que 'foo' * tenga * la propiedad' bar'. – npup

+4

Por lo tanto, para resumir: la capacidad de expansión está en * write *, no access. Los objetos Javascript le permiten escribir una nueva propiedad a un objeto sin tener que predefinir esa propiedad, como se requiere en algunos otros idiomas. – XML

4

Un artículo escrito en 2007 que utiliza document.all (como el única manera de acceder a los elementos)? Esa es una gran bandera roja.

Es solo disfrazarse "Puede agregar propiedades a un objeto" con algunas palabras de moda.

Necesitamos poder hacer esto porque de lo contrario no podríamos almacenar datos, y eso haría que JavaScript fuera un lenguaje bastante inútil.

(todo es una matriz? No, no lo es. Y se itera sobre un objeto sin un envoltorio hasOwnProperty. Eso no es seguro. Hemos de tener lejos del artículo, es peor que inútil)

+0

Sí, ese artículo fue un verdadero desastre. Ay. – npup

10

Todo, excepto los tipos primitivos (cadena, número, booleano) son objetos y admiten la estructura Clave: valores. las propiedades (claves) se pueden acceder y establecer usando la notación de punto así como los corchetes.

var myObj = {}; 
myObj.myProp1 = 'value1'; //works, an expando property 
myObj[myProp2] = 'value2'; // doesn't work, myProp2 is an undefined name. 
myObj['myProp2'] = 'value2'; // works , an expando property 
myObj[2010]= 'value'; //note the key is number, still works, an expando property?? 
myObj.2010 = 'value'; // FAILS. to use dot notation, key must be a string 
+2

Incluso los tipos primitivos se envuelven automáticamente en Objetos cuando es necesario. 'var i = número nuevo (3); i.someProperty = "someValue"; console.log (i.someProperty); ' – igor

+2

@igor:" Automáticamente "es la palabra incorrecta, y un poco engañosa. Envolvió explícitamente 'i' en un objeto Number, que le permite usar propiedades de expansión. En consecuencia, esto no funcionará: 'var i = 3; i.someProperty = "someValue"; console.log (i.someProperty); ' – theazureshadow

+0

ah ... lo siento ... tienes razón. El operador 'nuevo' hace su trabajo. Lo siguiente no funciona tan bien: var i = Number (3); i.someProperty = "someValue"; console.log (i.someProperty); – igor

4

JavaScript convierte elementos con ID específicos de nombres en expandos del objeto DOM devuelto. Se explica here.