Board = function()
{
var cells = [8];
/**
* Initializing every cell using numeric format.
* */
for (var i=0 ; i<8; i++){
cells[i] = [8];
for (var j=0 ; j<8; j++)
cells[i][j] = new Cell(new Position(i,j));
}
....
}
別のコード GameManager.js で、
var duplicateBoard = Copy.deepCopy(board);
board.moveCell(1,2)
そして、私が使用しているディープコピーには、
参照: http://jsperf.com/deep-copy-vs-json-stringify-json-parse
function deepCopy(o) {
var copy = o,k;
if (o && typeof o === 'object') {
copy = Object.prototype.toString.call(o) === '[object Array]' ? [] : {};
for (k in o) {
copy[k] = deepCopy(o[k]);
}
}
return copy;
}
私の必要性:(
コンストラクcells
ターのプライベートメンバー)をBoard
ディープコピーしたい。
問題 :
しかし、firebug でデバッグしたところ、関数がコンストラクターのプライベート オブジェクトをdeepCopy
ディープ コピーしていないことがわかりました。
私の場合:
board.moveCell(1,2)
、ここで cell[1][2] も移動されduplicateBoard
ます。
つまりcell
、ボードと複製ボードの両方がセル[1][2]への同じ参照を持っています。
私が追跡したものは何ですか?
ディープ コピー関数は、 を関数として扱いconstructor
ます。したがって、関数のディープ コピーは無視されtypeof o === 'object
ます。しかし、この条件を削除することは有用ではありません。そうすることで、duplicateBoard
すべての関数が型になるのではなく、関数がなくなるからobject{}
です。