Javascript中的對像賦值與Java中是一樣的,都為引用傳遞.就是說,在把一個對像賦值給一個變量時,那么這個變量所指向的仍就是原來對像的地址.那怎么來做呢 答案是克隆.
什么是"clone"?
在實際編程過程中,我們常常要遇到這種情況:有一個對象A,在某一時刻A中已經包含了一些有效值,此時可能會需要一個和A完全相同新對象B,并且此后對B任何改動都不會影響到A中的值,也就是說,A與B是兩個獨立的對象,但B的初始值是由A對象確定的。在Java/javasript語言中,用簡單的賦值語句是不能滿足這種需求的。要滿足這種需求雖然有很多途徑,但實現clone()方法是其中最簡單,也是最高效的手段,當然了 javascript語言中并沒有此方法.
所以我特意寫了兩個克隆方法:一個為淺復制 ,一個為深復制.解釋: 淺復制(影子克隆):只復制對象的基本類型,對象類型,仍屬于原來的引用. 深復制(深度克隆):不緊復制對象的基本類,同時也復制原對象中的對象.就是說完全是新對象產生的.
下面是測試代碼: 運行代碼框 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITLE> New Document </TITLE><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><META NAME="Generator" CONTENT="Wawa Editor 1.0"><META NAME="Author" CONTENT="八神奄"><META NAME="Keywords" CONTENT="Javascript,Java,XML,XSLT,ASP,VBScript,ASP .net,C#,C++,Database"><META NAME="Description" CONTENT="不及格的程序員,無所不在"></HEAD><BODY><SCRIPT LANGUAGE="JavaScript"><!--function Object.prototype.clone(){var newObj = new Object();for(elements in this){newObj[elements] = this[elements];}return newObj;}function Object.prototype.cloneAll(){function clonePrototype(){}clonePrototype.prototype = this;var obj = new clonePrototype();for(var ele in obj){if(typeof(obj[ele])=="object") obj[ele] = obj[ele].cloneAll();}return obj;}var obj1= new Object();obj1.Team= "First";obj1.Powers= new Array("Iori","Kyo");obj1.msg= function(){alert()};obj1.winner= new Object();obj1.winner.name= obj1.Powers[0];obj1.winner.age= 23;obj1.winner.from= "Japan"var obj1_clone= obj1.cloneAll();obj1_clone.Team= "Second";obj1_clone.Powers= new Array("Jimmy","Anndy");obj1_clone.winner.name= obj1_clone.Powers[1];obj1_clone.winner.age= 22;obj1_clone.winner.from= "USA";msg = "2003界拳皇單打獨斗杯,拳皇挑戰賽: \n\n A組 對戰形式:\n\n"msg += obj1.Team+" 組 ,人員名單:"+obj1.Powers+"\n";msg += "第一輪過后,勝利者為:"+obj1.winner.name +" ,參賽者年齡:"+obj1.winner.age+" ,來自島國: "+obj1.winner.from+"\n";msg += "\n\n B組 對戰形式:\n\n"msg += obj1_clone.Team+" 組 ,人員名單:"+obj1_clone.Powers+"\n";msg += "第一輪過后,勝利者為:"+obj1_clone.winner.name +" ,參賽者年齡:"+obj1_clone.winner.age+" ,來自國際警察部隊: "+obj1_clone.winner.from+"\n";alert(msg);//--></SCRIPT></BODY></HTML> [Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行](出處:藍色理想)
|