对象克隆

243 阅读2分钟

第一部分克隆介绍:

1、为何需要对象克隆?

克隆的对象可能包含一些已经修改过的属性,而new出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠clone方法了。相比把临时属性一个个赋给new出来的对象,clone是一个native方法吧,在底层实现,更方便,速度更快。

 Student a =new Student();
 Student b = a;

d05cda3d8de94f088b095b82200441da.png

2、如何实现克隆?

先介绍一下两种不同的克隆方法,浅克隆深克隆

第二部分浅克隆喝深克隆:

1、浅克隆

在浅克隆中,当对象被复制时只复制自身和其中包含值类型的成员变量,而引用类型的成员对象并没有复制。

f334663274466e2ca79ae6287d743a3c.png

在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>

微信图片_20211109104514.png

2、深度克隆

在深克隆中,除了对象本身被复制外,对象所包含的所有成员变量也将被复制。

在Java语言中,如果需要实现深克隆,可以通过覆盖Object类的clone()方法实现,也可以通过序列化等方式来实现。

5c1e05f425168fcb31a9697dd45bb760.png

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>

微信图片_20211109105141.png

第三部分对象克隆

对象克隆是一种创建对象的精确副本的方法。 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>