javascript设计模式交流(二) Prototype Pattern(2)
作者:winter 来源:无忧脚本 发布时间:2007-11-29 14:01:00
内置对象的clone
但是,到这里为止,我们还没有考虑内置对象,内置对象不能用普通方法clone 我们要考虑的内置对象有这么几个:
Function Array String Boolean Number Date
RegExp Error和Math没有需要clone的场景 所以不在我们的考虑之中。
对Function来说,完全产生一个副本是不可能的,因为我们无法保证构造的函数跟原来的函数在同一作用域,但是不包含作用域的实现是很容易的:
eval(this);
或者使用Function构造
return Function(new String("return ")+this)();
Function本身是个Object 因此必须加上Object的clone 实现functionPrototypeClone需要一点小花招
/************************************/
function functionClone()
{
var ret=Function(new String("return ")+this)();
for(var p in this)
{
ret[p]=this[p];
}
return ret;
}
/************************************/
function functionDeepClone()
{
var ret=Function(new String("return ")+this)()
for(var p in this)
{
if(typeof ret[p]!=object)ret[p]=this[p];
ret[p]=objectDeepClone.call(this[p]);
}
return ret;
}
/************************************/
function functionPrototypeClone()
{
var tmp=Function.prototype;
Function.prototype=this;
var ret=(new Function(new String("return ")+this))();
Function.prototype=tmp;
return ret;
}
/************************************/
Array只要保证length正确就可以了
/************************************/
function arrayClone()
{
var ret=new Array();
for(var p in this)
{
ret[p]=this[p];
}
return ret;
}
/************************************/
function arrayDeepClone()
{
var ret=new Array();
for(var p in this)
{
if(typeof ret[p]!=object)ret[p]=this[p];
ret[p]=objectDeepClone.call(this[p]);
}
return ret;
}
/************************************/
function arrayPrototypeClone()
{
var tmp=Array.prototype;
Array.prototype=this;
var ret=new Array();
Array.prototype=tmp;
return ret;
}
/************************************/
Date对象提供了getTime 所以可以很容易实现
/************************************/
function dateClone()
{
var ret=new Date();
ret.setTime(this.getTime());
for(var p in this)
{
ret[p]=this[p];
}
return ret;
}
/************************************/
function dateDeepClone()
{
var ret=new Date();
ret.setTime(this.getTime());
for(var p in this)
{
if(typeof ret[p]!=object)ret[p]=this[p];
ret[p]=objectDeepClone.call(this[p]);
}
return ret;
}
/************************************/
function datePrototypeClone()
{
var tmp=Date.prototype;
Date.prototype=this;
var ret=new Date();
ret.setTime(this.getTime());
Date.prototype=tmp;
return ret;
}
/************************************/
String Boolean Number都是只读的对象,所以只要=就可以了。


猜你喜欢
- 前言大家应该都知道,Centos是目前最为流行的Linux服务器系统,其默认的Python 2.x,但是根据python社区的规划,在不久之
- Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4
- 进入python的安装目录, 查看python解释器进入bin目录 # ls python(看一下是否有python解释器版本) # pwd
- 最近笔者学会了用FrontPage XP做网页,心理特高兴,非常想把我在制作主页过程中的一些经验和大家交流交流、切磋切磋,我们一起来看看吧。
- 安装Python2.7后,它自带一个编辑器IDLE,但是使用几次之后出现启动不了的情况,可做如下操作。Windows操作系统下,使用快捷键
- Node.js uses an event-driven, non-blocking I/O model that makes it lig
- 概述虽然Python的强项在人工智能,数据处理方面,但是对于日常简单的应用,Python也提供了非常友好的支持(如:Tkinter),本文主
- 1、ThreadPoolExecutor多线程<1>为什么需要线程池呢?对于io密集型,提高执行的效率。线程的创建是需要消耗系统
- 设置模板路径在django项目下创建templats文件来存放html文件为了减少模板加载调用过程及模板本身的冗余代码,Django 提供了
- 本文实例为大家分享了Python/Django后端使用PIL Image生成头像缩略图的具体代码,供大家参考,具体内容如下import os
- 新建py文件,在里面写入Python代码,代码的功能是打印10次“Hello!”,将代码文件保存到桌面上:在命令行中运行Python脚本,并
- 何谓socket计算机,顾名思义即是用来做计算。因而也需要输入和输出,输入需要计算的条件,输出计算结果。这些输入输出可以抽象为I/O(inp
- 前言:MYSQL 应该是最流行了 WEB 后端数据库。虽然 NOSQL 最近越来越多的被提到,但是相信大部分架构师还是会选择 MYSQL 来
- 变量作用域变量由作用范围限制分类:按照作用域分类全局(global):在函数外部定义局部(local):在函数内部定义变量的作用范围全局变量
- 一.脚本基础1.USE语句设置当前数据库。2.声明变量语法:DECLARE @变量名 变量类型在声明变量后,给变量赋值之前,变量的值为NUL
- 这篇文章阐述的是一种函数式编程(functional-programming)设计模式,我称之为惰性函数定义(Lazy Function D
- 先让我们看一个例子,了解什么是模式化窗口。以下是QQ秀商城在非登录时提示登录的一种状态。当我在非登录状态,通过保存形象的方式买一件衣服时,弹
- 一、验证码示例 二、php验证码类,secoder.class.php<?php/** * 安全验证码 * * 安全的验证码要:验证
- 近日,朋友写一个关于成绩管理的系统,其中遇到一个小问题。如果按照SQLSERVER的ORDER 排序时,比如遇到两个100分,结果必然是名次
- 一、实例将以下列表的backup_unit_id全部提取出来示例:dbs = [{ &nbs