模式:
////////////////////////////////////////////////////////////////////////为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);}
新闻热点
疑难解答