对JScript对象的实例Clone的一个实现

刚才看见cmbscqhd关于'JS继承问题的研究',发现他的继承方法的问题出在对对象使用了shallow copy (this[i] = _childClass.prototype[i];)上。不过从他的代码中我发现了一个实现Clone很sexy的方法,于是写一个JScript类实例的的deep clone方法,和对JScript所支持对象(数据类型)的Clone详细比较。

    实现Clone最关键的就是要创建一个和原对象类型相同的对象,不然还叫什么Clone呢?然后再把原对象里的值Copy到目标对象,如果遇到值本身是对象的,还需要继续递归创建和复制数据。

    JScript对象实例的Clone方法代码如下:
对JScript对象的实例Clone的一个实现<script language="javascript">
对JScript对象的实例Clone的一个实现Object.prototype.Clone 
= function()
对JScript对象的实例Clone的一个实现
{
对JScript对象的实例Clone的一个实现    
var objClone = new this.constructor();
对JScript对象的实例Clone的一个实现    
for ( var key in this )
对JScript对象的实例Clone的一个实现    
{
对JScript对象的实例Clone的一个实现        
if ( objClone[key] != this[key] )
对JScript对象的实例Clone的一个实现        

对JScript对象的实例Clone的一个实现            
if ( typeof(this[key]) == 'object' )
对JScript对象的实例Clone的一个实现            

对JScript对象的实例Clone的一个实现                objClone[key] 
= this[key].Clone();
对JScript对象的实例Clone的一个实现            }

对JScript对象的实例Clone的一个实现            
else
对JScript对象的实例Clone的一个实现            
{
对JScript对象的实例Clone的一个实现                objClone[key] 
= this[key];
对JScript对象的实例Clone的一个实现            }

对JScript对象的实例Clone的一个实现        }

对JScript对象的实例Clone的一个实现    }

对JScript对象的实例Clone的一个实现    
if ( !objClone || ('' + objClone) == '' )
对JScript对象的实例Clone的一个实现    
{
对JScript对象的实例Clone的一个实现        
return (new String(this+ objClone) ? this : objClone;
对JScript对象的实例Clone的一个实现    }

对JScript对象的实例Clone的一个实现    
else
对JScript对象的实例Clone的一个实现    
{
对JScript对象的实例Clone的一个实现        objClone.toString 
= this.toString;
对JScript对象的实例Clone的一个实现        
return objClone; 
对JScript对象的实例Clone的一个实现    }
 
对JScript对象的实例Clone的一个实现}
    
对JScript对象的实例Clone的一个实现
</script>

    这段代码中最关键的两点就是:var objClone = new this.constructor();和objClone[key] = this[key].Clone();。一个完成相同对象创建,一个完成了deep clone。最后那个判断到底是返回this还是返回objClone,是用来对对象类型或空Array的一个优化。这个Clone方法对所有(不包括Function、Global和Math)JScript对象实例的Clone效果分析如下:
   对JScript对象的实例Clone的一个实现

    显现对于值类型这个Clone方法不能很好的工作:(,还有一个比较特殊的对象类型,就是Date,它也不能被正常的Clone。不过这个不是很严重的问题,要在Clone方法里面去判断被Clone的对象是不是Date、Boolean和Number相对来说是很容易的。我没有加到这个方法中去是为了保持这个方法的清爽,因为我们值类型本身是不存在Clone问题的,赋值即就是Clone了。

    附Clone方法的测试源代码:
对JScript对象的实例Clone的一个实现<html>
对JScript对象的实例Clone的一个实现<head>
对JScript对象的实例Clone的一个实现    <title>JScript Inherit Research</title>
对JScript对象的实例Clone的一个实现    <meta name="author" content="cmbscqhd;[email protected]博客园" />
对JScript对象的实例Clone的一个实现</head>
对JScript对象的实例Clone的一个实现<body>
对JScript对象的实例Clone的一个实现    <script language="javascript">对JScript对象的实例Clone的一个实现</script>
对JScript对象的实例Clone的一个实现    <script language="javascript">对JScript对象的实例Clone的一个实现</script>
对JScript对象的实例Clone的一个实现</body>
对JScript对象的实例Clone的一个实现</html>对JScript对象的实例Clone的一个实现

本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。