Cas*_*erg 4 javascript class object
我有一个董事会成员:
var board = new Board();
Run Code Online (Sandbox Code Playgroud)
我想复制一块电路板并movePiece在新电路板上运行一个函数:
var newBoard = board;
newBoard.movePiece('4a', '3b');
Run Code Online (Sandbox Code Playgroud)
因为我只是分配给它,都board和newBoard将有感动件.
如何克隆电路板以创建一个名为newBoard的精确副本,我可以将其移动并且原始电路板将保持不变?
我尝试了几种不同的方法,例如:
Object.assign({}, orig)
Run Code Online (Sandbox Code Playgroud)
和
function clone(orig) {
let origProto = Object.getPrototypeOf(orig);
return Object.assign(Object.create(origProto), orig);
}
Run Code Online (Sandbox Code Playgroud)
为任意对象创建可靠克隆的唯一方法是在该对象上编写一个方法,该方法接受一个实例并从原始实例的属性创建一个新实例.
这是因为外部代理无法确切地知道如何处理每个实例变量(需要分配的内容,需要复制的内容等等),并且也可以拥有私有实例变量.因此,只需编写一个新方法,创建一个新对象并复制相关属性或一个构造函数,该构造函数采用另一个对象并执行相同操作.
可以有一个对象,可以将所有属性分配给新实例(如果所有属性都是基元),但通常情况并非如此,因此需要应用更多智能来确定如何最好地将每个属性分配给新的克隆.而且,一个对象可能有私有实例变量(闭包变量),这些变量也可能必须从其他方法中手动处理.
这是一个相对简单的对象的例子,它只有一个需要复制的数组.这个支持通过构造函数或克隆方法创建克隆:
function CallbackList(otherObj) {
// if another object is passed to the constructor, then initialize this
// new instance to be a copy
if (otherObj) {
// copy the array from the other instance
this.list = otherObj.list.slice(0);
} else {
// initalize empty list
this.list = [];
}
}
CallbackList.prototype = {
addListener: function(fn) {
this.list.push(fn);
},
removeListener: function(fn) {
for (var i = this.list.length - 1; i >= 0; i--) {
if (this.list[i] === fn) {
this.list.splice(i, 1);
}
}
},
fire: function(/* pass args here */) {
var args = Array.prototype.slice.call(arguments);
this.list.forEach(function(fn) {
fn.apply(null, args);
});
},
clone: function() {
return new CallbackList(this);
}
};
Run Code Online (Sandbox Code Playgroud)
要了解为什么需要专门为您的对象构建的自定义代码来创建克隆,以下是您可能必须以特定于对象的方式处理的实例数据中的一些内容: