Массив объектов: ссылка на существующие объекты или новые экземпляры - PullRequest
2 голосов
/ 04 июня 2011

У меня есть следующая структура (или класс?) В 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] не будет отражать эти изменения.

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

Ответы [ 4 ]

2 голосов
/ 04 июня 2011

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

http://jsfiddle.net/bJaL4/

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

2 голосов
/ 04 июня 2011

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

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

1 голос
/ 04 июня 2011

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

1 голос
/ 04 июня 2011

Вы можете либо изменить объект напрямую:

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

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

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

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

$.myNameSpace.matrixPos[row][column] = tmp;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...