javascript设计模式交流(二) Prototype Pattern

作者:winter 来源:无忧脚本 时间:2007-11-29 14:01:00 

看看上一篇《javascript设计模式交流(一)Singleton Pattern

本文将讨论Prototype Pattern的js实现,之后讨论javascript的prototype继承和Prototype Pattern的关系。

Prototype Pattern是一种创建型模式,在GoF Book中它的意图被描述成用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。

Prototype Pattern本身实际上非常简单,任何一个提供了clone()方法的对象都可以成为原型对象,所有通过它复制的对象都属于一类对象。在静态语言中,这一模式被用于运行时指定对象类型,相比工厂模式,这一模式无需创建与类层次平行的工厂类结构,实现上要方便得多。

clone的三种js实现

在js中,clone方法的实现并不困难,对js的6种基本类型来说 string boolean undefined null number皆可直接用=赋值,唯一麻烦的是object。

对object 我们可以用clone其所有成员的方式复制 作为方法的函数可以这样定义:


/************************************/
        function objectClone()
        {
                var ret=new Object();
                for(var p in this)
                {
                        ret[p]=this[p];
                }
                return ret;
        }


但我们显然面对着一个问题:this[p]也可能是一个object 所以很可能我们需要用递归来实现deepClone


    function objectDeepClone()
        {
                var ret=new Object();
                for(var p in this)
                {
                        if(typeof ret[p]!=object)ret[p]=this[p];
                        else ret[p]=objectDeepClone.call(this[p]);
                }
                return ret;
        }


对js来说 实现clone还有另外一种方式,在javascript中,构造器的prototype属性指明了某一类的原型,当实例化时,这一原型被作为对象的原型使用。特别地,这个prototype对象也可能是从某一原型构造出来的,这形成了一个类似继承的结构,所以javascript的面向原型特性又被称作原型继承(尽管我很不赞同这种做法,还是要提一下)。
    回到我们前面的Prototype Pattern,javascript天生的引用型原型继承为我们提供了另外一种clone的实现方式:


 function objectPrototypeClone()
        {
                var tmp=function(){};
                tmp.prototype=this;
                return new tmp;
        }


这样clone出来的对象只读地共享一个原型的属性,它的最大优势是速度非常快,当我们希望快速复制大型对象时,可以使用这种方式,但是它会造成访问速度降低,而且它实时反映父节点的变化。

标签:Prototype,Pattern,模式,javascript
0
投稿

猜你喜欢

  • 用Python的SimPy库简化复杂的编程模型的介绍

    2023-06-19 16:55:45
  • 使用python切片实现二维数组复制示例

    2021-11-02 22:24:41
  • selenium+python实现基本自动化测试的示例代码

    2023-12-10 00:17:07
  • 对python产生随机的二维数组实例详解

    2022-10-29 14:13:28
  • python 执行文件时额外参数获取的实例

    2022-09-24 05:46:54
  • 详解PyTorch中Tensor的高阶操作

    2021-11-24 12:08:00
  • JavaScript实现简单的tab选项卡切换

    2024-06-17 06:22:43
  • php遍历CSV类实例

    2023-11-01 23:46:26
  • Python实现PS图像抽象画风效果的方法

    2022-10-25 14:08:42
  • MySQL 数据库 source 命令详解及实例

    2024-01-15 10:50:58
  • .img/.hdr格式转.nii格式的操作

    2023-08-25 04:56:14
  • Python Socket 编程知识点详细介绍

    2021-10-28 16:31:29
  • 使用ASP实现广告代理

    2010-05-27 12:15:00
  • Uchome1.2 1.5 代码学习 common.php

    2023-11-15 02:56:10
  • Ajax+Servlet+jsp显示搜索效果

    2023-06-14 08:29:34
  • Python接口自动化浅析pymysql数据库操作流程

    2024-01-16 16:33:02
  • OpenCV半小时掌握基本操作之对象测量

    2023-06-08 12:09:18
  • jQuery事件的绑定、触发、及监听方法简单说明

    2024-02-24 12:50:53
  • Python中pandas dataframe删除一行或一列:drop函数详解

    2021-07-09 16:46:47
  • Python机器学习应用之朴素贝叶斯篇

    2024-01-02 23:11:15
  • asp之家 网络编程 m.aspxhome.com