#1 07.06.10 17:29
[JS] изменение объекта по ссылке
Например есть код.
Код::
var a = {
add: {
1: 'sd;lskd;akd',
2: ';dklfjds;kfjs'
},
bdd: {
1: 'sd;lskd;akd',
2: ';dklfjds;kfjs'
}
};
var b = a.add[1];
b = {};сейчас в результате перемнная b будет содержать пустой объект - вроде как все логично.
НО! как его переделать так, чтобы при изменении переменной b, менялось то место, куда она ссылалась? - т.е. a.add[1]
на php это делается применением & оператора
Код::
var b = &$a->add[1];
а на JS как? в инете так и не нашел ничего - может конечно не там искал, но тем не менее - подскажите кто знает как быть в данной ситуации...
Offline
#5 09.07.10 12:07
Re: [JS] изменение объекта по ссылке
для чего тебе переменная b?
тебе надо либо сохранить результат a.add[1], либо изменить его через ссылку.
и то и другое ты можешь делать через механизм closures:
var a = {
add: {
1: 'sd;lskd;akd',
2: ';dklfjds;kfjs'
},
bdd: {
1: 'sd;lskd;akd',
2: ';dklfjds;kfjs'
}
};
function q(s){
var b = s.add[1]; //сохранил результат
s.add[1] = {}; //если нужно изменил
// либо сделал b = {};
return function(){ return b; };
}
var m = q(a);
alert(m()); //получи свою b
Offline
#6 09.07.10 12:50
Re: [JS] изменение объекта по ссылке
sav, ссылки используют, когда хотят избежать копирования.
представь, что у тебя в s.add[1] лежит 1 гигабайт данных.
вот таким действием
var b = s.add[1];
ты занял уже 2 гигабайта памяти.
В JS нельзя создать две переменных указывающих на одну область памяти.
Можно только напрямую манипулировать объектом, что ты и показал.
Offline
#8 23.07.10 00:49
Re: [JS] изменение объекта по ссылке
JS не копирует объекты и их дочерние элементы.
т.е. при передаче не строк/числе, а объектов в которых хронятся эти строки числа, мы передаем указатели.
т.е. вот так будет работать:
Код::
var a = {
add: {
1: ['sd;lskd;akd'],
2: [';dklfjds;kfjs']
},
bdd: {
1: ['sd;lskd;akd'],
2: [';dklfjds;kfjs']
}
};
var b = a.add[1];
b[0] = 'asd';
alert(a.add[1][0]); // уже будет asdили так:
Код::
var a = {
add: {
1: 'sd;lskd;akd',
2: ';dklfjds;kfjs'
},
bdd: {
1: 'sd;lskd;akd',
2: ';dklfjds;kfjs'
}
};
var b = a.add;
b[1] = 'asd';
alert(a.add[1]); // уже будет asdхотя кривовато получилось. но думаю смысл понятен.
Offline
#9 23.07.10 15:18
Re: [JS] изменение объекта по ссылке
В дополнение к вопросу про сслки
// Here we create an object representing the date of Christmas, 2007
// The variable xmas contains a reference to the object, not the object itself
var xmas = new Date(2007, 11, 25);
// When we copy by reference, we get a new reference to the original object
var solstice = xmas; // Both variables now refer to the same object value
// Here we change the object through our new reference to it
solstice.setDate(21);
// The change is visible through the original reference, as well
xmas.getDate( ); // Returns 21, not the original value of 25
// The same is true when objects and arrays are passed to functions.
// The following function adds a value to each element of an array.
// A reference to the array is passed to the function, not a copy of the array.
// Therefore, the function can change the contents of the array through
// the reference, and those changes will be visible when the function returns.
function add_to_totals(totals, x)
{
totals[0] = totals[0] + x;
totals[1] = totals[1] + x;
totals[2] = totals[2] + x;
}
// Finally, we'll examine comparison by reference.
// When we compare the two variables defined above, we find they are
// equal, because they refer to the same object, even though we were trying
// to make them refer to different dates:
(xmas == solstice) // Evaluates to true
// The two variables defined next refer to two distinct objects, both
// of which represent exactly the same date.
var xmas = new Date(2007, 11, 25);
var solstice_plus_4 = new Date(2007, 11, 25);
// But, by the rules of "compare by reference," distinct objects are not equal!
(xmas != solstice_plus_4) // Evaluates to true
Offline
#10 23.07.10 17:21
#11 24.07.10 08:32
Re: [JS] изменение объекта по ссылке
Igo написал(а):
Например есть код.
Код::
var a = { add: { 1: 'sd;lskd;akd', 2: ';dklfjds;kfjs' }, bdd: { 1: 'sd;lskd;akd', 2: ';dklfjds;kfjs' } }; var b = a.add[1]; b = {};сейчас в результате перемнная b будет содержать пустой объект - вроде как все логично.
НО! как его переделать так, чтобы при изменении переменной b, менялось то место, куда она ссылалась? - т.е. a.add[1]
на php это делается применением & оператораКод::
var b = &$a->add[1];а на JS как? в инете так и не нашел ничего - может конечно не там искал, но тем не менее - подскажите кто знает как быть в данной ситуации...
А вообще, ответ на данный вопрос звучит так:
Когда ты делаешь b = {}, то ты фактически b переопределяешь ссылаться на совершенно новый объект, поэтому старый не меняется.
Тоже самое в Java:
SomeClass s = new SomeClass('1');
SomeClass v = s;
v = new SomeClass('2'); // ну не возможно таким образом нигде поменять s. (при условии, что SomeClas - ни Singleton, ни Monostate)
Offline

