Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как записать в массив новый объек а не ссылку на исходный объект (https://javascript.ru/forum/misc/7527-kak-zapisat-v-massiv-novyjj-obek-ne-ssylku-na-iskhodnyjj-obekt.html)

Casufi 06.02.2010 20:12

Как записать в массив новый объек а не ссылку на исходный объект
 
Поясню на примере:
Вот как я делаю

var colDaysModels = new Array();

	DefaultColModel = {
		align : 'left',
		editable : true,
		edittype : 'sring',
		sortable : false,
		resizable : false
	};

	DefaultColModel['name'] = 'id';
	DefaultColModel['label'] = 'id';
	DefaultColModel['width'] = 25;
	colDaysModels.push(DefaultColModel);
	DefaultColModel['name'] = 'cost';
	DefaultColModel['label'] = 'cost';
	DefaultColModel['width'] = 100;
        colDaysModels.push(DefaultColModel);;


В результате в массиве оказывается два элемента
[{... name:cost, label:cost,width:100},{... name:cost, label:cost,width:100}]

Как сделать так чтобы в массиве первым был элемент
{name:id, label:id,width:25}

Octane 06.02.2010 20:26

заново создавайте объект

Casufi 06.02.2010 20:34

мне нужно в новый объект перетянуть данные, которые задавал для DefaultColModel

Octane 06.02.2010 20:37

копируйте эти свойства)

Casufi 06.02.2010 20:46

Я сейчас сделал таким образом
colDaysNames.push('id');
	colDaysNames.push('cost');
	DefaultColModel['name'] = 'id';
	DefaultColModel['label'] = 'id';
	DefaultColModel['width'] = 25;
	var MyModel1 = DefaultColModel;
	colDaysModels.push(MyModel1);
	DefaultColModel['name'] = 'cost';
	DefaultColModel['label'] = 'cost';
	DefaultColModel['width'] = 100;
	var MyModel2 = DefaultColModel;
	colDaysModels.push(MyModel2);


Судя по результату не правильно.
Можно какимто образом скопировать все элементы старого массива в новый , есл мы заранее не знаем ни их количесиво ни их имена.

Dmitry A. Soshnikov 06.02.2010 20:51

Casufi, создайте конструктор, дефолтные свойства пропишите в прототипе, специфичные для инстансов - в конструкторе:

function ColModel(data) {
  this.name = data.name;
  // и т.д.
}

// дефолтные свойства (будут унаследованы из прототипа всеми инстансами)
ColModel.prototype.editable = true;

colDaysModels.push(new ColModel({name: 'foo'}));
colDaysModels.push(new ColModel({name: 'bar'}));

subzey 06.02.2010 20:52

var a = [];
a[1] = '17';
a['object'] = {};

var b = [];

for (var i in a){
if (!a.hasOwnProperty(i)) continue;
b[i] = a[i];
};

alert(b['object']);

Casufi 06.02.2010 21:00

спасибо

Casufi 07.02.2010 22:21

Цитата:

Сообщение от Dmitry A. Soshnikov (Сообщение 43796)
Casufi, создайте конструктор, дефолтные свойства пропишите в прототипе, специфичные для инстансов - в конструкторе:

function ColModel(data) {
  this.name = data.name;
  // и т.д.
}

// дефолтные свойства (будут унаследованы из прототипа всеми инстансами)
ColModel.prototype.editable = true;

colDaysModels.push(new ColModel({name: 'foo'}));
colDaysModels.push(new ColModel({name: 'bar'}));

У меня работает все кроме ColModel.prototype.editable = true;
Такая конструкция не задает дефолтніе свойства.

Вот мой кусок кода
function ColModel(data) {
this.name = data.name;
this.editable = data.editable;
}
ColModel.prototype.editable = true;
colDaysModels.push(new ColModel({name: 'foo'}));
colDaysModels.push(new ColModel({name: 'bar'}));[/JS][/quote]

В конечном результате свойство editable не определено

Octane 07.02.2010 22:40

Цитата:

Сообщение от Casufi
this.editable = data.editable;

так вы в конструкторе создаете одноименное свойство объекта со значением undefined


Часовой пояс GMT +3, время: 07:21.