第一部分克隆介绍:
1、为何需要对象克隆?
克隆的对象可能包含一些已经修改过的属性,而new出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠clone方法了。相比把临时属性一个个赋给new出来的对象,clone是一个native方法吧,在底层实现,更方便,速度更快。
Student a =new Student();
Student b = a;
2、如何实现克隆?
先介绍一下两种不同的克隆方法,浅克隆和深克隆。
第二部分浅克隆喝深克隆:
1、浅克隆
在浅克隆中,当对象被复制时只复制自身和其中包含值类型的成员变量,而引用类型的成员对象并没有复制。
在Java语言中,通过覆盖Object类的clone()方法可以实现浅克隆。
//浅层克隆实现
<script>
var obj ={
name:"abc",
age:20,
sex:'男',
arr:['aaa','bbb','ccc']
}
function copy(origin,target){
var target =target ||{};
//为了阻止用户不传target,给了参数就直接用,不给就当空对象
for(var prop in origin){
target[prop] = origin[prop];
}
return target;
}
var obj1 =copy(obj);
</script>
2、深度克隆
在深克隆中,除了对象本身被复制外,对象所包含的所有成员变量也将被复制。
在Java语言中,如果需要实现深克隆,可以通过覆盖Object类的clone()方法实现,也可以通过序列化等方式来实现。
script>
var obj = {
name: 'abc',
age: 20,
sex: 'male',
arr: ['aaa', 'bbb', 'ccc', {
qq: 12345,
email: '12345@qq.com'
}]
}
function deepCopy(origin, target) {
var target = target || {};
// 为了防止用户不传 target(容错),给了参数就直接用,不给就当空对象
toStr = Object.prototype.toString;
// 给函数创建一个引用 简化代码
var arrStr = '[object Array]';
// 给该比对字符串创建一个引用 简化代码
// var objStr = '[object Object]';
for (var prop in origin) {
// 先判断是不是原型上的属性,如果是false 就是原型上的属性,而我们不需要拷贝原型上的属性
if (origin.hasOwnProperty(prop)) {
if (typeof (origin[prop]) !== 'null' && typeof (origin[prop]) == 'object') {
// 判断是 引用值 再区分数组和对象
if (toStr.call(origin[prop]) == arrStr) {
// 是数组 创建空数组
target[prop] = [];
} else {
// 是对象 创建空对象
target[prop] = {};
}
deepCopy(origin[prop], target[prop]);
} else {
// 判断是 原始值 直接进行赋值
target[prop] = origin[prop];
}
}
}
return target;
}
var obj1 = deepCopy(obj);
</script>
第三部分对象克隆
对象克隆是一种创建对象的精确副本的方法。 Object类的clone()方法用于克隆对象。java.lang.Cloneable接口必须由我们要创建其对象克隆的类实现。如果我们不实现Cloneable接口,clone()方法生成CloneNotSupportedException。
clone()方法在Object类中定义。 clone()方法的语法如下:
protected Object clone() throws CloneNotSupportedExceptio
例如object.assign方法:
<body style = "text-align:center;">
<h1 style = "color:green;" >
js克隆对象
</h1>
<p id="demo2">sourceObject = {a:1, b:2, c:3};</p>
<button onClick="fun()">click
</button>
<p id="demo"></p>
<script>
function fun(){
const sourceObject = {a:1, b:2, c:3};
let tO = {};
tO = Object.assign({}, sourceObject);
document.getElementById("demo").innerHTML =
"targetObject a = "+tO.a+", b = " + tO.b+", c = "+tO.c;
}
</script>
</body>