如何使用Java中的数组成员深度复制(克隆)对象?
作者:互联网
介绍
我有一个Person类,其中包含Person和函数的数组:
function Persons() {
this.mItems = []; // Array of Objects Person
}
Persons.prototype = {
calculateScores : function() {
// Do some stuff
}
}
班级人员具有成员和职能:
function Person(name) {
this.name = name; // Name of the Person
this.score = 0;
}
Person.prototype = {
calculateScore : function() {
// Do some stuff
}
}
我希望程序执行以下操作:
var persons = new Persons();
var person0 = new Person("John");
var person1 = new Person("Sam");
persons.mItems.push(person0);
persons.mItems.push(person1);
// Completely clone the original Objects
clonedPersons = persons.clone(); // I am looking for a clone() function
// Modify an item in the cloned Objects
clonedPersons.mItems[0].name = "Mick";
// Check that the original Objects have not been modified
console.log(persons.mItems[0].name); // John : Not modified
console.log(clonedPersons.mItems[0].name); // Mick
题
我想复制一个Person实例以完全复制Person数组.对象人必须重复.对象的功能必须保留.
JQuery.extend()
JQuery.extend(true,{},person)克隆Person的直接成员,但浅拷贝Person对象.
console.log(persons.mItems[0].name); // Mick : Where is John ?!
console.log(clonedPersons.mItems[0].name); // Mick
JSON.parse(json.stringify())
clonedPersons = JSON.parse(json.stringify(persons))克隆对象,但删除函数.
persons.mItems[0].calculateScore(); // Does not exists !!!
谢谢您的回答.
解决方法:
如果要处理自定义类,则将要实现自定义克隆方法.通常,在这种情况下,我将有2个单独的克隆函数,一个在Person模型上,另一个在Persons集合上.
Persons.prototype = {
clone: function() {
var clone = new Persons();
clone.mItems = this.mItems.map(function(person) {
return person.clone();
});
return clone;
}
}
Person.prototype = {
clone: function() {
var clone = new Person(this.name);
clone.score = this.score;
return clone;
}
}
这种方法的优点是它可以将关注点分离开-Person类不必知道如何克隆单个Person,而只需知道Person公开了一个clone方法.如果Person添加了应保留在克隆中的新属性,则仅需更改Person.
使用通用克隆方法通常是一种反模式,例如在这种情况下来自jQuery或Underscore.他们最终会克隆您不想要的东西,或者丢失您要做的事情(例如,一个人最终可能拥有一个地址或一些其他也需要克隆的对象).
标签:javascript,arrays,object,deep-copy,clone 来源: https://codeday.me/bug/20191011/1895831.html