当前页面: 开发资料首页 → Javascript 专题 → JavaScript的Prototype(原型)方式实现
摘要: JavaScript,Design Pattern,Prototype
写在前面:
这是我前段时间和Jeff.Yan的一些讨论搞,主要关于JavaScript的Design Pattern,因为没有整理,都是最原始的email内容,我会陆续的贴出一点我给他信,至于他的一些回答和讨论的结果,我会在征求他本人意见的情况下,尽可能完整的贴出来
因为是和Jeff.Yan的讨论稿,对于我发信内容的发表都同时署名,对于他给我的回信,如果征得他本人同意的情况下在文字中我依然会特别说明。
JavaScript的Prototype实现
作者:Jeff.Yan(阎宏),BlueSwing.Liu(刘如鸿)
//////////////////////////////////////////////////////////////////////
//为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 +"\n";
strMsg+="CurrentPage: " + o.getPage() +"\n";
strMsg+="Caption: " + o.Caption +"\n";
strMsg+="Expanddo Property Author: " + o.Author;
alert(strMsg);
}