java 对象的深度克隆_如何使用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值