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)
对于我正在使用的 Deepcopying,
参考: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
发生深拷贝 board 和 duplicateBoard 对 cell[1][2] 的引用相同。
我追踪了什么?
deep-copy 函数将 视为constructor
一个函数,因此它忽略了对函数的深拷贝,因为它会在typeof o === 'object
. 但是删除这个条件是没有用的,因为这样做duplicateBoard
没有函数,而是所有函数都是object{}
类型的。