JS: связанные объекты

#javascript #oop

#javascript #ооп

Вопрос:

Сценарий: — заполнить объект1 — скопировать содержимое объекта1 в объект2 — удалить элемент из объекта1

Результат теперь: — у обоих object1 и object2 удален 1 элемент …?!

Желаемый результат: — у object1 должно быть на 1 элемент меньше, чем у object2

Код:

 var object1 = new Object();
object1['key_one']   = 'value_1';
object1['key_two']   = 'value_2';
object1['key_three'] = 'value_3';
object1['key_four']  = 'value_4';
var object2 = new Object();
object2 = object1;
delete object1['key_three'];
  

Что я делаю не так?

Комментарии:

1. я не вижу никакой связи с многомерными массивами..

2. Ваш код не соответствует вашему объяснению. Я подозреваю, что вы делаете поверхностное копирование, но ваш код вообще не копирует.

Ответ №1:

Ваш код не выполняет никакого копирования. object2 это просто новый, пустой объект. Попробуйте это:

 var object1 = {
  key_one: "value_1",
  key_two: "value_2",
  key_three: "value_3",
  key_four: "value_4"
};
var object2 = {};
for (var prop in object1) {
  object2[prop] = object1[prop];
}
delete object1["key_three"];
  

Теперь object2 это копия object1 , но удаление свойств из object1 не повлияет object2 .

Надеюсь, это имеет смысл.

Комментарии:

1. черри, ты спас мой день, это работает! тысячу раз спасибо! правила stackoverflow!

2. @Ozcar: Тогда отметьте этот ответ правильным. Дайте человеку некоторую репутацию!

3. @Ozcar: не забывайте использовать hasOwnProperty .

4. да, если у вас есть кодовая база, которая модифицируется, Object.prototype тогда hasOwnProperty это важно.

Ответ №2:

Мне не кажется, что object2 когда-либо получал какие-либо свойства object1. Вы на правильном пути, но вам нужно их скопировать.

 var object1 = new Object();
object1['key_one']   = 'value_1';
object1['key_two']   = 'value_2';
object1['key_three'] = 'value_3';
object1['key_four']  = 'value_4';

var object2 = new Object();
for(var i in object1){
    object2[i] =  object1[i];
}
delete object1['key_three'];