2012-05-09 11 views
14

El comportamiento se puede ver en este pequeño fragmento (ejecutarlo como un script global):Uso de la variable "name" no funciona con un objeto JS

var name = {}; 
name.FirstName = 'Tom'; 
alert(name.FirstName); 

rendimientos de la alerta undefined en Chrome pero las obras en IE y Firefox. También consigo un valor raro cuando hago

alert(name); 
+1

'language' atributo está en desuso, utilizar sólo el atributo' type' . También es mejor usar 'console.log' en lugar de' alert' y usar el Chrome Dev. Herramientas (o FireBug) para leerlos. Y finalmente necesita tener un tipo de documento en la línea 1 de su código, un doctype es: '' –

+2

AFAIK es más común usar la sintaxis 'var name = {}' también. – Hamish

+0

Fue solo error tipográfico ... Ingresé 'Objeto' no objeto. todavía arroja un error en Chrome. prueba el nuevo código en cromo. –

Respuesta

17

window.name tiene un propósito especial, y se supone que es una cadena. Chrome parece convertirlo explícitamente en una cadena, por lo que var name = {}; termina dando a la variable global name (es decir, window.name) un valor de "[object Object]". Dado que es un primitivo, las propiedades (name.FirstName) no se "pegarán".

Para solucionar este problema, no use name como variable global.

+0

Buena captura ... No presté atención al nombre de la variable en absoluto. –

+0

@FelixKling Casi trato a 'name' como una palabra reservada, ya que algunos hosts dan a las funciones una propiedad' name' también (he sido mordido por eso antes), el cierre no lo minificará, etc. –

+0

Sí, hay He estado un par de preguntas con ese problema por lo que puedo recordar ... –

0

window.name se utiliza para establecer el nombre de la ventana, y como el nombre de la ventana solo puede ser una cadena, todo lo que establezca en window.name se convierte en una cadena. Y las cadenas, como valores primitivos, no pueden tener propiedades. La solución es usar un nombre de variable diferente o un alcance diferente.

Como alternativa, puede usar window.name como desee si tiene este código primero. No recomiendo esto en absoluto, pero, al igual que una prueba de concepto:

(function() { 
    var _name; 
    window.__defineGetter__('name', function() { 
     return _name; 
    }); 
    window.__defineSetter__('name', function (v) { 
     _name = v; 
    }); 
})(); 

Además, se debe utilizar en lugar de {}new Object. Además de ser más conciso, también es más eficiente y más explícito.

+0

O simplemente 'borrar nombre;' – Oriol

6

Su variable name es en realidad window.name, porque las variables de nivel superior declaradas con var están asociadas al objeto global.

La especificación HTML5 requires that window.name is a DOMString. Esto significa que el valor de window.name puede only be a sequence of characters, no es un objeto.

En Chrome, un intento de usar window.name para almacenar algo excepto una cadena primitiva forzará el valor de una cadena primitiva. Por ejemplo:

window.name = {}; 
window.name === "[object Object]"; // true 

Puede evitar este problema mediante el uso de una variable name que no está en el ámbito de nivel superior:

(function() { 
    var name = {}; 
    // this `name` is not `window.name` 
    // because we're not in the top-level scope 

    console.log(name); 
})(); 
Cuestiones relacionadas