Официальный сайт студ.городка НГТУ
Программирование и БД » [JS] изменение объекта по ссылке 

#1  07.06.10 17:29

Igo
Профиль

[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

#2  08.06.10 10:19

$up
Профиль

Re: [JS] изменение объекта по ссылке

в JS нельзя

Offline

#3  08.07.10 11:12

sav
Профиль

Re: [JS] изменение объекта по ссылке

var a = {
  add: {
1: 'sd;lskd;akd',
2: ';dklfjds;kfjs'
},
bdd: {
1: 'sd;lskd;akd',
2: ';dklfjds;kfjs'
}
};

function q(s){
s.add[1] = {};
}

alert(a.add[1]);

q(a);

alert(a.add[1]);

Offline

#4  08.07.10 16:23

$up
Профиль

Re: [JS] изменение объекта по ссылке

sav, где переменная b?

Offline

#5  09.07.10 12:07

sav
Профиль

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

$up
Профиль

Re: [JS] изменение объекта по ссылке

sav, ссылки используют, когда хотят избежать копирования.

представь, что у тебя в s.add[1] лежит 1  гигабайт данных.

вот таким действием
var b = s.add[1];

ты занял уже 2 гигабайта памяти.

В JS нельзя создать две переменных указывающих на одну область памяти.
Можно только напрямую манипулировать объектом, что ты и показал.

Offline

#7  09.07.10 12:53

Re: [JS] изменение объекта по ссылке

Igo написал(а):

при изменении переменной b, менялось то место, куда она ссылалась? -

sav написал(а):

для чего тебе переменная b?
тебе надо либо сохранить результат a.add[1], либо изменить его через ссылку.

я ничего не понял!

Offline

#8  23.07.10 00:49

Maq
Профиль

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

sav
Профиль

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

$up
Профиль

Re: [JS] изменение объекта по ссылке

Признаю, был категоричен 8) Думал про простые типы и совсем забыл про объекты.

Offline

#11  24.07.10 08:32

sav
Профиль

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

Программирование и БД » [JS] изменение объекта по ссылке 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.034 сек.
Выполнено 14 запросов.