Hola:
También ocurre en los objetos, si no hacemos una copia explicita de todas sus propiedades las variables funcionan como el anterior ejemplo de Panino:
Código PHP:
function obj(x) {
this.x = x;
}
// Establecimiento
var foo = new obj(6);
var bar = foo;
// Mostramos
alert("foo.x = "+foo.x); // 6 como se espera
alert("bar.x = "+bar.x); // 6 como se espera
// Cambio
bar.x = 18;
// Mostramos
alert("foo.x = "+foo.x); // 18 en vez de 6 ¡!
alert("bar.x = "+bar.x); // 18 como se espera
También ocurre exactamente igual con las variables que son funciones dentro de un objeto, al modificar una de un objeto, se modifican todas las de su copia:
Código PHP:
function obj(x) {
this.x = x;
this.cuadradoDeX = function() {
this.x = Math.pow(this.x, 2);
}
}
// Establecimiento
var foo = new obj(6);
var bar = foo;
// En este punto foo.x = bar.x, y además son la misma. También es lo mismo foo.cuadradoDeX que bar.cuadradoDeX
// Modifico, teoricamente sólo en bar
bar.cuadradoDeX = function() {
this.x = Math.pow(this.x, 3);
}
// En este punto es lo mismo foo.cuadradoDeX que bar.cuadradoDeX, las dos hacen el cubo, y las dos afectan a la misma x.
// ejecuto la modificada, pero afectará también a foo.
bar.cuadradoDeX();
// Mostramos
alert("foo.x = "+foo.x); // 6^3=216, podríamos esperar 6^2 al no haber modificado foo.cuadradoDeX
alert("bar.x = "+bar.x); // 6^3=216, como se espera
Hay que tener un poquito de cuidado, pero se entiende rápido, sólo pasa en variables de Arrays o en Objets.
Saludos