2011-05-09 22 views
5

Estoy tratando de definir un objeto multidimensional en JavaScript con el siguiente código:Javascript objeto multidimensional

function A(one, two) { 
    this.one = one; 
    this.inner.two = two; 
} 

A.prototype = { 
    one: undefined, 
    inner: { 
     two: undefined 
    } 
}; 
A.prototype.print = function() { 
    console.log("one=" + this.one + ", two=" + this.inner.two); 
} 

var a = new A(10, 20); 
var b = new A(30, 40); 
a.print(); 
b.print(); 

El resultado es:

one=10, two=40 
one=30, two=40 

, pero espero que

one=10, two=20 
one=30, two=40 

¿Qué estoy haciendo mal? ¿Es una variable inner una variable de clase, no una instancia?

Motor de JavaScript: Google V8.

+1

Al pensar en JavaScript, no piense en términos de 'instancia' en términos de' alcance'. – Hogan

+0

@Hogan, buen punto. Es importante recordar que, aunque JS tiene estructuras que parecen clases, en realidad son objetos de primera clase y deben tratarse como tales. –

Respuesta

5

Porque el objeto literal para inner se comparte para todas las instancias. Pertenece al prototype y, por lo tanto, cada instancia comparte el mismo objeto. Para evitar esto, puede crear un nuevo literal de objeto en el constructor.

+0

+1: pero, ¿podría mostrar el código para crear el nuevo objeto literal? – Hogan

+0

Básicamente lo mismo solo tiene que hacerse en el constructor. 'this.inner = {two: two};' –

+0

Sí, resuelve mi problema. Pero en este caso, el código queda menos documentado. – ZeroDivisi0n

0

La pieza inner es un objeto global no vinculado a una instancia.