Javascript Object.Create копирование ссылки на объект

У меня есть следующий код

ViewModel.prototype.update = function(initial) {
  var ittr, key, val, x;
  for (key in initial) {
    val = initial[key];
    if ($.isArray(val) && $.isArray(this[key]())) {
      ittr = 0;
      while (ittr < val.length) {
        if (this[key].length > ittr) {
          if ((this[key][ittr - 1]) instanceof ViewModel) {
              x = Object.create(this[key][ittr - 1]);
              x.update(val[ittr]);
              this[key].push(x);
          }
        }
      }
    }
  }
}

У меня есть объекты, наследуемые от ViewModel, и все они имеют обновление в качестве функции. У меня есть массив, который я обновляю новым материалом из объекта json (начальный). Иногда объект Json длиннее существующего массива, который я обновляю, поэтому я хочу добавить объекты того же типа. Я использую Object.create(этот [ключ][ittr -1]), который указывает на последний объект в массиве, и пытается создать новый объект из этого. Проблема в том, что на каждой итерации он не создает новый объект, а просто копирует старый. Есть идеи, как я могу это остановить?

Я также пробовал jquery

new $.extend({},this[key][ittr - 1])

Я пытался превратить х в массив

x[ittr] = Object.create(this[key][ittr - 1]);
x[ittr].update(val[ittr]);
this[key].push(x[ittr]);

Когда я вызываю x.update, он меняет каждое значение в массиве, которое было установлено равным x. Поэтому я никогда не создаю новый объект, когда вызываю Object.create

1 ответ

Ну, первый аргумент Object.create это объект, который вы хотите быть прототипом вновь созданного объекта. Смотрите MDN. По сути, это будет новый объект, но он будет выглядеть как старый объект, потому что он наследует все свойства старого объекта через его прототип. Попробуйте пройти ViewModel.prototype в качестве первого аргумента, а старый объект в качестве второго аргумента. Маршрут расширения не будет полностью успешным, так как новый объект будет иметь все свойства старого объекта, за исключением того, что он не будет наследоваться от ViewModel.prototypeи, следовательно, не будет обновлений или каких-либо других методов / свойств прототипа.

Другие вопросы по тегам