Javascript Object.Create复制对象的引用

时间:2012-10-17 21:41:27

标签: javascript object new-operator 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(this [key] [ittr -1])指向数组中的最后一个对象,并尝试从中实例化一个新对象。问题是,每次迭代,它都不会创建新对象,但它只是旧对象的副本。知道如何阻止它吗?

我也尝试了jquery

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

我已经尝试将x制作成数组

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

当我调用x.update时,它会更改已设置为x的数组中的每个值。所以当我调用Object.create

时,我实际上从未创建过新对象

1 个答案:

答案 0 :(得分:0)

嗯,Object.create的第一个参数是你想成为新创建对象原型的对象。见MDN。本质上,它将是一个新对象,但它看起来像旧对象,因为它通过它的原型继承旧对象的所有属性。尝试传递ViewModel.prototype作为第一个参数,将旧对象作为第二个参数。扩展路由不会完全成功,因为新对象将具有旧对象的所有属性,除了它不会从ViewModel.prototype继承,因此不会有更新或任何其他原型方法/属性