Foros del Web » Programando para Internet » Javascript »

Referencia a un objeto

Estas en el tema de Referencia a un objeto en el foro de Javascript en Foros del Web. Hola amigos, Esta es una pregunta muy básica, pero me he atorado en ella sin darme cuenta... ¿cómo copiar un objeto en otra variable sin ...
  #1 (permalink)  
Antiguo 12/12/2011, 16:50
 
Fecha de Ingreso: noviembre-2001
Ubicación: México DF
Mensajes: 128
Antigüedad: 18 años, 1 mes
Puntos: 0
Referencia a un objeto

Hola amigos,
Esta es una pregunta muy básica, pero me he atorado en ella sin darme cuenta... ¿cómo copiar un objeto en otra variable sin que se mantenga la referencia al anterior?

Ejemplo:
Código:
// con numeros funciona bien
var uno = 5;
var dos = uno; 
uno = 10;
alert(dos); // retorna 5

// con objetos no funciona
var uno = {x:5};
var dos = uno;
uno.x = 10;
alert(dos.x); // retorna 10
Me imagino que la respuesta debe ser muy básica, pero no me había pasado esto antes... jajaja
Saludos!!!
  #2 (permalink)  
Antiguo 12/12/2011, 17:17
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 10 años, 8 meses
Puntos: 1485
Respuesta: Referencia a un objeto

buenas...
por suerte, la 5ta edición de ECMAScript define una función nativa -creo- para ese propósito. en particular Object.create. aún no me he visto con exactitud como funciona, pero revisa los ejemplos del enlace. sin embargo, desgraciadamente hay navegadores que aún no tiene las nuevas funciones de ECMAScript, por ejemplo iexplorer8. para los navegadores sin soporte puedes crear una función que cumpla con dicho propósito. por ejemplo, iterar las propiedades de un objeto con for/in e ir recreandolas en otro nuevo objeto. como nunca me he visto en esa necesidad, desconozco si esa es la forma correcta o eficiente.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #3 (permalink)  
Antiguo 12/12/2011, 17:26
 
Fecha de Ingreso: noviembre-2001
Ubicación: México DF
Mensajes: 128
Antigüedad: 18 años, 1 mes
Puntos: 0
Respuesta: Referencia a un objeto

Gracias zerokilled,
Mi aplicación funciona de la siguiente manera... es un mapa de Google (utilizando la API de Google Maps) en el cual aparecen capas con polígonos previamente cargados de una base de datos.
Si el usuario selecciona EDITAR una capa, yo debo guardar en un arreglo temporal todos esos objetos, para que una vez que el usuario haya hecho cambios, yo poder tener los objetos originales por si el usuario decide CANCELAR las modificaciones yo poder restaurar los polígonos originales.
Son muchas capas, cada una de ellas tiene cientos de polígonos, cada uno de los cuales posee miles de coordenadas... por eso se me hace un poco engorroso iterar cada objeto para crear copias de los mismos.
¿No hay otra manera más sencilla?
Saludos y gracias por la respuesta,
Silver
__________________
Nuedi Servicios SA de CV
http://www.nuedi.mx
  #4 (permalink)  
Antiguo 12/12/2011, 17:51
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 10 años, 8 meses
Puntos: 1485
Respuesta: Referencia a un objeto

lo poco que conoci de la api google maps, ya se me olvido. respecto a como copiar (clonar) un objeto, en la web hay muchas opiniones. mira por ejemplo la extensa respuesta de este tema en stackoverflow. si de casualidad estas usando jquery, john resig comparte una corta explicación sobre como hacerlo con jquery. por otro lado, revisa la documentación de la api google maps si tiene un método especificamente para clonar los objetos que crea la api.

ahora bien, respecto al asunto de google maps. no se porque pero tengo la impresión de que estas planteando "mal" la solución. en lugar de clonar todos los objetos, clona aquellos con los que el usuario esté directamente interactuando. es decir, cuando el usuario toque un elemento en particular, en ese momento lo clonas a otra variable.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #5 (permalink)  
Antiguo 12/12/2011, 19:57
 
Fecha de Ingreso: noviembre-2001
Ubicación: México DF
Mensajes: 128
Antigüedad: 18 años, 1 mes
Puntos: 0
Respuesta: Referencia a un objeto

Hola amigo,
Ya encontré la manera de "clonar" el objeto... como también estoy usando ExtJS, pues hay una función Ext.apply(nuevo Object, origen Object)
Acerca de clonar solo el objeto con el que se interactúa, pues habría que sacar unas cuentas a ver de qué manera se afecta menos el rendimiento... pues con el método actual tendría que clonar todos los elementos de una capa (pueden ser unos 200) y con el método que me dices tendría que agregar onClick listeners a todos los elementos de todas las capas, pueden ser unos 7,000-10,000 (para que se pueda detectar con cuál de ellos se está interactuando)
¿O hay otra manera de hacerlo?
__________________
Nuedi Servicios SA de CV
http://www.nuedi.mx
  #6 (permalink)  
Antiguo 12/12/2011, 20:10
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 10 años, 8 meses
Puntos: 1485
Respuesta: Referencia a un objeto

lee acerca de delegación de eventos, eso te evitará tener que registrar tantos eventos por elementos. en términos básicos, consiste en registrar el listener (evento) en un elemento ancestro el cual escuchará los eventos que se generen los elementos descendientes. o sea, uno para todos los hijos. la implementación es un tanto distinta, pero creeme es mucho más eficiente.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #7 (permalink)  
Antiguo 13/12/2011, 15:59
 
Fecha de Ingreso: noviembre-2001
Ubicación: México DF
Mensajes: 128
Antigüedad: 18 años, 1 mes
Puntos: 0
Respuesta: Referencia a un objeto

Gracias zerokilled,

Ya resolví el problema... usando la delegación de eventos, ahora los listener están en una clase parent y los eventos nada más se crean una vez, en el constructor de esa clase... por lo tanto se hereda por sus hijos.
En cuanto a la clonación de los polígonos, no le veo otra alternativa.
El usuario puede estar editando una capa (que contenga, por ejemplo 100 polígonos), y dentro de esa capa está modificando un polígono en específico... yo tengo que dar la posibilidad de cancelar los cambios realizados al polígono actual y los cambios realizados a toda la capa... por eso necesito clonar todos los componentes de la capa... o al menos no clonar el objeto completo sino la propiedad donde están las coordenadas, que es lo que el usuario edita.

Saludos y gracias again,
Silver
__________________
Nuedi Servicios SA de CV
http://www.nuedi.mx

Etiquetas: funcion, objeto, referencia
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:08.