Solo me preguntaba si es posible actualizar las variables de referencia de objetos si la variable es una cadena. Funciona, si asigno todo el objeto, pero no funciona con la cadena. También podría asignar todo el objeto, pero el problema aquí es que no necesito un objeto, pero necesito una cadena, ya que es una variable global del servicio Angular 2.
https://jsfiddle.net/009kqqrt/
obj = { var: 'initial' }; a = [{ test: 'old', new: 'no' }, { test: obj.var, new: 'yes' }]; o = { test: obj.var, new: 'yes' }; obj.var = 'objModified'; alert(o.test); // Changes correctly obj.var = 'arrModified'; alert(a[1].test);Aquí está el jsfiddle.
El resultado esperado sería -
primera alerta - 'objModified' segunda alerta - 'arrModified'
En mi caso, obtengo siempre 'inicial'.
Creo que lo que quieres hacer es pasar la referencia del objeto.
var obj = { var: 'initial' }; var a = [{ test: 'old', new: 'no' }, { test: obj, new: 'yes' }]; var o = { test: obj, new: 'yes' }; obj.var = 'objModified'; alert(o.test.var); // Changes correctly obj.var = 'arrModified'; alert(o.test.var);Violín actualizado: https://jsfiddle.net/echonax/009kqqrt/2/
Si pasa la referencia de cadena como, test: obj.var ya que las cadenas son inmutables, no cambiará.
La forma en que lo escribió a y o los objetos hacen referencia al valor de obj.var en el momento en que se crean.
Cualquier cambio en ese valor después de que se creen no se propagará a a y o .
Si desea que funcione de esa manera, deberá hacer que la propiedad de prueba haga referencia a un objeto en lugar de hacer referencia al valor directamente.
obj = { var: 'initial' }; a = [{ test: 'old', new: 'no' }, { test: obj, new: 'yes' }]; o = { test: obj, new: 'yes' }; obj.var = 'objModified'; alert(o.test.var); // o.test=== obj is true obj.var = 'arrModified'; alert(a[1].test.var); // a[1].test=== obj is trueCuando crea la matriz a y el objeto o , la test de propiedades se inicializa con el valor de una variable de cadena simple, por lo que sus valores se almacenan "como valor".
obj = { var: 'initial' }; a = [{ test: 'old', new: 'no' }, { test: obj.var, new: 'yes' }]; o = { test: obj.var, new: 'yes' };Si inicializa eso con una referencia de objeto, como el siguiente ejemplo:
var obj = { var: 'initial' }; a = [{ test: 'old', new: 'no' }, { test: obj, new: 'yes' }]; o = { test: obj, new: 'yes' }; obj.var = 'objModified'; console.log(o.test.var); obj.var = 'arrModified'; console.log(a[1].test.var);Puede ver que su valor se modificará cuando se modifique el objeto al que se hace referencia, eso se debe a que su valor se almacena por referencia.
Espero haber sido claro, adiós.