模式:
////////////////////////////////////////////////////////////////////////為Object添加Clone的方法,因為所有的對象的頂級對象都是Object//因此所有用戶自定義對象都實現了Clone的方法//////////////////////////////////////////////////////////////////////Object.prototype.Clone=function(){ function CloneModel(){ } CloneModel.prototype=this; var objClone=new CloneModel(); var strMsg=""; for( v in objClone){ switch (typeof objClone[v]){ case "function": //如果是方法,不需要進行clone break; case "object": /////////////////////////////////////////////////////////////////////// //如果是對象,采用Clone重新得到,這樣做的目的在于能夠進行深度Clone //因為javascript是一個Object Based的語言,不然內部對象是指向原來的引用 /////////////////////////////////////////////////////////////////////// objClone[v]=objClone[v].Clone(); break; default: /////////////////////////////////////////////////////////////////////// //其余數據類型情況下全部重新賦值 //這樣做的目的就是保證數值在內存中的存放是在新對象的空間中 //而不僅僅指向Parent Object的一個refrence /////////////////////////////////////////////////////////////////////// objClone[v]=objClone[v]; } } return objClone;}
function BookInfo(vCaption){ this.Caption=vCaption; var curPage=0; this.setPage=function(vData){ curPage=vData; } this.getPage=function(){ return curPage; } }
////////////////////////////////////test BookInfo 's clone method////////////////////////////////////function test(){ var objTest=new BookInfo("javascript Prototype Pattern"); objTest.setPage(1000); objTest.Author="Ruhong.Liu"; //object expanddo ShowObject(objTest,"原始對象"); //Clone Object from objTest var objCloned=objTest.Clone(); ShowObject(objCloned,"Clone之后的對象"); //if you changed the objTest's caption //you can find objCloned's caption has be changed objTest.Caption="Changed Base Object"; //show message ShowObject(objTest,"修改Caption之后的原始對象"); ShowObject(objCloned,"修改Caption之后的clone對象"); /* //----------這段代碼可以不工作------------------------// //now you can change objCloned's caption objCloned.Caption="hello,Jeff.Yan"; //show message ShowObject(objTest,"Clone對象Caption修改之后的原始對象"); ShowObject(objCloned,"Clone對象Caption修改以后");*/ }function ShowObject(o,vCaption){ var strMsg=vCaption +""; strMsg+="CurrentPage: " + o.getPage() +""; strMsg+="Caption: " + o.Caption +""; strMsg+="Expanddo Property Author: " + o.Author; alert(strMsg);}
新聞熱點
疑難解答