实现Clone最关键的就是要创建一个和原对象类型相同的对象,不然还叫什么Clone呢?然后再把原对象里的值Copy到目标对象,如果遇到值本身是对象的,还需要继续递归创建和复制数据。
JScript对象实例的Clone方法代码如下:
<
script
language
="javascript"
>
Object.prototype.Clone = function ()
{
var objClone = new this .constructor();
for ( var key in this )
{
if ( objClone[key] != this [key] )
{
if ( typeof ( this [key]) == 'object' )
{
objClone[key] = this [key].Clone();
}
else
{
objClone[key] = this [key];
}
}
}
if ( ! objClone || ('' + objClone) == '' )
{
return ( new String( this ) + objClone) ? this : objClone;
}
else
{
objClone.toString = this .toString;
return objClone;
}
}
</ script >
Object.prototype.Clone = function ()
{
var objClone = new this .constructor();
for ( var key in this )
{
if ( objClone[key] != this [key] )
{
if ( typeof ( this [key]) == 'object' )
{
objClone[key] = this [key].Clone();
}
else
{
objClone[key] = this [key];
}
}
}
if ( ! objClone || ('' + objClone) == '' )
{
return ( new String( this ) + objClone) ? this : objClone;
}
else
{
objClone.toString = this .toString;
return objClone;
}
}
</ script >
这段代码中最关键的两点就是: var objClone = new this .constructor();和objClone[key] = this[key].Clone();。一个完成相同对象创建,一个完成了deep clone。最后那个判断到底是返回 this还是返回objClone,是用来对 非对象类型或空Array的一个优化。这个Clone方法对所有(不包括Function、Global和Math)JScript对象实例的Clone效果分析如下:
显现对于值类型这个Clone方法不能很好的工作:(,还有一个比较特殊的对象类型,就是Date,它也不能被正常的Clone。不过这个不是很严重的问题,要在Clone方法里面去判断被Clone的对象是不是Date、Boolean和Number相对来说是很容易的。我没有加到这个方法中去是为了保持这个方法的清爽,因为我们值类型本身是不存在Clone问题的,赋值即就是Clone了。
附Clone方法的测试源代码:
<
html
>
< head >
< title >JScript Inherit Research </ title >
< meta name ="author" content ="cmbscqhd;birdshome@博客园" />
</ head >
< body >
< script language ="javascript" > </ script >
< script language ="javascript" > </ script >
</ body >
</ html >
< head >
< title >JScript Inherit Research </ title >
< meta name ="author" content ="cmbscqhd;birdshome@博客园" />
</ head >
< body >
< script language ="javascript" > </ script >
< script language ="javascript" > </ script >
</ body >
</ html >