2011-06-04 2 views
2

Я имею следующую структуру (или класс?) В JavaScript:массив объектов: ссылка на существующие объекты или новые экземпляры

function ImageStruct() { 
    this.id = -1; 
    this.isCover = true; 
    this.isPaired = false; 
    this.row = -1; 
    this.column = -1; 
} 

Я добавить этот класс в двумерный массив.

var imgStruct = new ImageStruct(); 
imgStruct.id = id; 
imgStruct.row = row; 
imgStruct.column = column; 

$.myNameSpace.matrixPos[row][column] = imgStruct; 

Когда я сделать что-то вроде этого:

var imgStrc = $.myNameSpace.matrixPos[row][column]; 

Если я изменяю imgStrc, объект в $.myNameSpace.matrixPos[row][column] не отражает, что изменения.

Есть ли способ «исправить» это?

+0

Связанный: http://stackoverflow.com/questions/518000/is-javascript-is-a-pass-by-reference-or-pass-by-value-language – Orbling

+0

'$ .myNameSpace.matrixPos [строка] [column] = imgStrc' снова после его изменения. – Orbling

+0

@Orbling: Я знаю, что это возможное решение, но я хочу знать, есть ли другой. Спасибо за ваши комментарии. – VansFannel

ответ

2

Если изменить imgStrc, изменив его свойства (например, делая imgStrc.id = 42), что изменение будет влиять на объект в $.myNameSpace.matrixPos[row][column] (как это на самом деле тот же объект).

Только если вы измените imgStrc, переназначив его, это не произойдет. Невозможно «исправить» это, кроме установки $.myNameSpace.matrixPos[row][column] = imgStrc или обертывания всего объекта в объект-оболочку (или одноэлементный массив).

1

Вы можете либо изменить объект непосредственно:

$.myNameSpace.matrixPos[row][column].someMethod(); 

, который по общему признанию, не очень удобно, или кормить значение обратно в массив после его изменения:

var tmp = $.myNameSpace.matrixPos[row][column]; 

tmp.someMethod(); // Do something... 

$.myNameSpace.matrixPos[row][column] = tmp; 
2

Это, безусловно, должно быть " по ссылке". Я установил JsFiddle для подтверждения.

http://jsfiddle.net/bJaL4/

Структуры не реально возможно в JavaScript. Существуют явные значения и ссылочные типы. Все объекты рассматриваются как ссылочные типы.

1

У JavaScript нет указателей. Последняя инструкция var просто перезаписывает значение imgStrc значением свойства пространства имен. Независимо от того, что это значение, вы изменили. Если это объект, все ссылки на этот объект будут видеть изменения.

Смежные вопросы