0

次のコードがあります

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 を呼び出すときに、実際に新しいオブジェクトを作成することはありません。

4

1 に答える 1

0

への最初の引数Object.createは、新しく作成されたオブジェクトのプロトタイプにしたいオブジェクトです。MDNを参照してください。基本的には新しいオブジェクトになりますが、プロトタイプを介して古いオブジェクトのすべてのプロパティを継承するため、古いオブジェクトのように見えます。ViewModel.prototype最初の引数として渡し、古いオブジェクトを 2 番目の引数として渡してみてください。ルートの拡張は完全には成功しません。新しいオブジェクトは、から継承しないことを除いて古いオブジェクトのすべてのプロパティをViewModel.prototype持つため、更新やその他のプロトタイプ メソッド/プロパティを持たないためです。

于 2012-10-17T22:22:05.970 に答える