2012-08-27 15 views
8

Estoy intentando que tanto las variables "my_a" como las letras.a apuntan al mismo objeto.¿Es posible tener 2 variables apuntando al mismo objeto? (javascript)

//i want letters.a to reference (point to) my_a, not be a copy... 
//expected output should be: letters.a = c 
//made variables into Objects.. but didn't help. 

var my_a = new Object('a'); 
var my_b = new Object('b'); 
var letters = {'a': my_a, 'b': my_b}; 

$('#output').append('my_a = ' + my_a + '<br>'); 
$('#output').append('leters.a = ' + letters.a + '<br>'); 

my_a = new Object('c'); 

$('#output').append('my_a = ' + my_a + '<br>'); 
$('#output').append('letters.a = <span style="color:red">' + letters.a + '</span>'); 
​ 

ver este violín:

http://jsfiddle.net/jCsUq/1/

Pero como se puede ver por la salida, esto no está funcionando.

¿Alguna idea? ¿Es esto posible con javascript?

Gracias.

+0

Bueno, en realidad no estás haciendo lo que crees que eres. Estás apuntando la variable interna de un objeto al valor de otro objeto. Hacer lo que estás tratando de hacer es tonto en JavaScript. ¿Puedo preguntar cuál es tu objetivo final? Tal vez podamos encontrar una mejor solución. – SpYk3HH

+0

@ SpYk3HH Solo necesito una referencia a la "letra" actual. Solo hay dos "letras". Viejo o nuevo Necesitan ser cambiados en diferentes momentos. letter1 se vuelve viejo, letter2 se vuelve nuevo. – Wesley

+0

@Wesley Actualicé mi respuesta con un posible enfoque, según las necesidades de soporte de su navegador. – Pointy

Respuesta

5

La respuesta a su pregunta es "sí", pero creo que su pregunta no describe exactamente lo que estamos tratando de hacer. Lo que desea es que letters.a haga referencia a la variable "my_a", en el sentido de lo que se puede hacer en C++ con el operador &. Eso no es posible en JavaScript.

En la declaración:

my_a = new Object('c'); 

que está dando "my_a" un nuevo valor, diferente. Por lo tanto, letters.a todavía se refiere a lo mismo que hizo, mientras que "my_a" ha cambiado. No hay forma de hacer que una propiedad variable o de objeto "rastree" a otra (en JavaScript).

edición — realidad se me ocurre que podría hacer algo como lo que está buscando mediante la definición de un "captador" de la "a" propiedad de "letras", que devuelve el valor actual de " my_a ". Sería requiere esa característica en el motor JavaScript que está utilizando, pero sería algo así:

var letters = {}; 
Object.defineProperty(letters, "a", { 
    get: function() { return my_a; }, 
    set: function(v) { my_a = v; } 
}); 

IE antes de IE9 no admite que, por desgracia. Here's the updated jsfiddle.

+0

Buena captura aquí – Austin

+0

Otra cosa que podría hacer sería hacer que las letras sean una matriz y escribir una función simple para fijar la matriz con nuevos caracteres. Algo así como 'function fifoArray (myArray, newValue) {myArray.pop(); myArray.unshift (newValue); } 'Entonces myArray [0] siempre sería el más nuevo y myArray [1] sería siempre el último – SpYk3HH

3

Puede punto 2 variables al mismo objeto o valor en javascript de esta manera:

var a = b = {}; 
// both a and b now reference the same object 

Además, no hay necesidad de utilizar el constructor de objetos, llaves sirven como el constructor y ahorra tener que escribir. Es decir, esto:

var a = new Object(); 

es equivalente a:

var a = {} 
+0

¿Hay alguna mejora o beneficio al hacer esto? –

2

Usted está confundido por el concepto de punteros. Cuando almacena un objeto en una variable, en realidad almacena la dirección de ese objeto en la variable.

Por lo tanto, my_a y letters.a contienen la dirección del mismo objeto. luego cambias my_a para contener la dirección de un nuevo objeto. ¡Pero letters.a todavía contiene la dirección del primer objeto!

Así que al final de su secuencia de comandos, tiene my_a apuntando al objeto 'c', y letters.a apuntando al objeto 'a'.

La única forma de obtener cartas.y un my_a para apuntar al objeto que llama a 'c', es a hacer

letters.a = my_a 

de nuevo, estableciendo letters.a para contener la dirección del nuevo objeto 'c'.

Por cierto, las variables que tienen un tipo más básico (como ints, char) realmente contienen el valor de la variable en sí, no un puntero a los datos reales.

0

Sí, es posible.

Estabas en la dirección correcta, pero cometiste un pequeño error. Cuando inicializó var letters = {'a': my_a, 'b': my_b};, insertó el objeto que my_a apuntó a en ese momento.

Cambiando my_a después no cambió letters, ya que contiene un puntero directo a Object('a').

0

Sí, es muy posible y es el valor predeterminado. Sin embargo, en su código está modificando la referencia (my_a = new Object ('c');) cuando quiere modificar el valor. Esto se vería más claramente si utilizara matrices en lugar de cadenas, p. my_1 = [23]; my_1 [0] = 8;

0

¿Por qué usted no está utilizando una construcción de este tipo:

var letters = {'a': (new Object('a')), 'b': (new Object('b'))}; 

Es mucho más en mi humilde opinión más limpio.

Cuestiones relacionadas