JavaScript的Prototype实现

JavaScript的Prototype实现

作者:Jeff.Yan(阎宏),BlueSwing.Liu(刘如鸿)


模式:
    Prototype(原始模型模式或者原型模式)
定义:
    通过给出一个原型对象来指明所要创建的对象的类型,然后用这个原型对象的方法创建出更多同类型的对象,原始模型模式属于对象的创建模式
 
JavaScript实现:
    在Java语言中对象都继承自java.lang.Object,而java.lang.Object就提供了Clone的方法,只要实现接口Cloneable,即表示支持Clone,否则抛出异常。在这点JavaScript是非常接近的,所有的对象都是从Object继承,不过Object并不支持Clone的方法,但是我们可以通过自己对于JavaScript通过expanddo的形式实现Clone方法,这样日后所有的对象创建都实现了Clone方法。
 
    因为JavaScript本身没有提供Clone的方法,同时对于对象的赋值如var a=new Object();var b=a,这样的代码a,b是指向同一对象的,要创建一个对象必须通过new 这个关键字来实现,因此在Clone的实现过程,我内部定义了一个构造子(constructor)CloneModel,同时指定其父对象为要进行Clone活动本身的对象,因此使用了this关键字,在我们定义的构造子CloneModel的基础上我们创建一个一个对象,因为构造子内部没有任何代码,新创建的对象实际上说所有的实现都在父对象中,也就是我们需要进行Clone的对象。到目前为止,我们已经创建了一个需要复制的对象,但是所有的值都是指向父对象的。
 
    在 JavaScript的面向对象方式中 ,我们曾经讨论过,如果没有覆盖父对象的值,那么这个时候是直接指向父对象的,在Prototype Pattern是要求Clone之后的对象的内部值是不应该相关的,而只要赋值一次,objClone的值都会在自己的内存空间里头,而不是还指向父对象。基于如此的考虑,objClone[v]=objClone[v];语句就是实现将父对象的值通过覆盖的方式拷贝到自己的内存来。(这里提及的内存应该是逻辑意义上的)
 
    深复制的实现
    在完成上述工作之后,只是实现了浅复制,对象方面依然是指向对象的引用,这个时候可以通过调用指向对象的Clone方法得到cloned对象的属性对象(因为不知道如何说了)。objClone[v]=objClone[v].Clone(); 这句代码就是完成如此的功能。

Clone方法的实现
 
对象类的定义

 
测试代码



 
 
结束语:
    按照我目前的理解和测试,我觉得prototype关键字不是prototype模式的实现,这点通过parent object可以得到验证。

相关文章
对该文的评论
ico_pencil.gifwindseeds ( 2004-05-09)
另外,补充一点,对于对象内部成员变量,最好不要写成var curPage,
会引起一些问题,具体什么问题我记不清了,我以前在开发中遇到过。

用下划线来区分私有和公共是比较标准的做法,js本身的对象就是这么
做的,比如Object。也就是说
私有变量:this._curPage = 0;
公共变量:this.curPange = 0;
ico_pencil.gifwindseeds ( 2004-05-09)
这篇文章写的艰深了一点,实际上没有这么复杂。prototype实际上就是一个对象链。
ico_pencil.gifliuruhong ( 2004-01-01)
记得认识Jeff的时候对于这个方面我也没有兴趣,不过后来在做Web Library的时候才发现Design Pattern的功底还是可以派上用场的,虽然我也不太赞成client端的脚本太多复杂。不过复杂只是相对的,如果是在你的Application开发中,我不太建议程序员在Web 上面的脚本花费太多的功夫,不过如果是希望编写一些比较通用的库文件提供给其他开发人员使用,我想设计方面的功底要求比其实现功能的功底更加重要吧。大家也应该可以看到网络上提供的脚本很多吧,如果在实现一些功能方面无法复用和可扩展,那么还是提供一些教学目的的脚本似乎更加合适一点。反过来说,Design Pattern的学习对于构件开发人员而言是一个很重要的基础,不管是windows下面的ActiveX开发,还是Open Source形式的library,对于Web UI Library开发人员而言,似乎也没有本质的区别
ico_pencil.gifleeeel ( 2003-12-29)
一定要将JS上升到这个境界,实在是高!
问题是在客户端JS写得太长,下载数据和内存占用都太大了
JS能不能简单地应用在开发中?
ico_pencil.gifkingdomzhf ( 2003-12-27)
是对象进一步拷贝,直到是function和primitive类型(不是对象)

转载于:https://www.cnblogs.com/sunsonbaby/archive/2005/02/02/101161.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值