Javascript玩转Prototype(一)——先谈C#原型模式

在《Javascript玩转继承(二)》中,我使用了原型继承法来实现Javascript的继承,那原型究竟奥秘何在。在这篇文章中,我就主要针对原型来展开讨论。

抛开Javascript,我们先来看我们熟悉的常规的面向对象语言。在23种设计模式中,大家一定会记得有一种设计模式——原型模式。我们先来看一下结构图:

 

 

(原图引自:http://terrylee.cnblogs.com/archive/2006/01/16/317896.html)

 

先来复习一下原型模式:看到这个图,大家一定会注意到这个千千万万的Clone()方法,这个就是原型模式的核心。原型模式就是用原型实例来创建对象的种类,然后通过拷贝这些原型来创建新的对象。

在.NET中,这个模式的实现很容易,我们只需要实现ICloneable接口:

我还记得在爱情左灯右行里那个Angel说了这样一句话,任何东西到了批量生产的时候,这个质量就得不到保证了。这个是典型的原型模式:批量生产。为什么质量会下降呢?原因就在于他是采用的复制。

看代码:

class People:ICloneable

{

     private string name;

     private int age;

     private List<string> friends = new List<string>();

     public People(string name,int age,params string[] names)

     {     

          this.name=name;

          this.age=age;

          foreach (string s in names)

          {

               friends.Add(s);

          }

     }

     public string Name

     {

          get{return name;}

          set{name=value;}

     }

     public int Age

     {

          get{return age;}

          set{age=value;}

     }

     public List<string> Friends

     {

          get { return friends; }

          set { friends = value; }

     }

     public object Clone()

     {

          return this.MemberwiseClone();

     }

     public override string ToString()

     {

          string ret = "name:"+name+" age:"+age+" friends: ";

          foreach (string s in friends)

          {

               ret += s + ",";

          }

          return ret;

     }

}

然后我们初始化一个对象:

People p1 = new People("Windking", 20, "111", "222", "333", "444");

接下来复制一个对象:

People p2 = (People)p1.Clone();

输出一下:

Console.WriteLine("p1:" + p1.ToString());

Console.WriteLine("p2:" + p2.ToString());

好,现在来改变:

p2.Name = "Xuan";

p2.Age = 22;

p2.Friends.Add("555");

再输入:

Console.WriteLine("p1:" + p1.ToString());

Console.WriteLine("p2:" + p2.ToString());

我们看到:p2的改变直接作用到了原型p1的数组元素。因为这只是一个浅复制,在复制的时候,对于引用类型只是复制了他的地址,也就是说当两个对象指向内部的同一个引用对象,因此当修改的时候,引用类型的值是牵一发而动全身的。这也就是所谓的"任何东西到了批量生产的时候,这个质量就得不到保证了"。

可能这时会有人问:String不也是引用类型么?为什么他并没有因为p2的改变而影响的原型呢?关于这个请关注我的下一篇文章:《C#玩转String》

那怎么办?可以解决么?可以的。之前是浅复制,我们只需要改成深复制,这就不是批量生产了,其实我个人认为这就不算克隆了,而只是相当于把创建新对象的任务给封装起来 罢了。先看这张图来理解下深复制和浅复制。

 

(原图引自:http://www.cnblogs.com/Terrylee/archive/2006/01/06/312493.html)

好,看看深复制的代码:

其他的代码与上述都一样,不同的只是复制的代码:

public object Clone()

{

     List<string> cloneFriends = new List<string>(friends);

     string[] cloneArrayFriends = cloneFriends.ToArray();

            //其实一点都不神秘,不过是把初始化对象封装罢了。

     return new People(this.name, this.age, cloneArrayFriends);

}

测试下:

p2的改变没有影响到原型p1。

好了,本来是要讲Javascript的Prototype的,结果却罗嗦了一页面的原型模式。太多了,我会在下文中来讨论Javascript的Prototype。敬请关注。

转载于:https://www.cnblogs.com/kym/archive/2009/01/25/1380883.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423550.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HDU 1176 免费馅饼 (动态规划、另类数塔)

免费馅饼 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 76293 Accepted Submission(s): 26722 Problem Description 都说天上不会掉馅饼&#xff0c;但有一天gameboy正走在回家的小径上&#xff0c;忽然天上掉…

shiro学习(17):easyui布局测试

工具sublime <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Document</title><link href"themes/black/easyui.css" rel"stylesheet" /><link href"themes…

正则表达式测试工具

这个工具最开始是年前写的&#xff0c;原文见如下地址&#xff1a;写了一个测试正则表达式的小工具 后来快过年的时候一直忙着给票贩子送钱去了&#xff0c;没有把它写完&#xff0c;今天抽空把一些细节的功能完成了一下&#xff0c;感兴趣的朋友可以下载试用&#xff1a;点击…

shiro学习(18):使用注解实现权限认证和后台管理三

工具idea 先看看数据库 shiro_role_permission 数据 shiro_user shiro_user_role 数据 目录结构 在pom.xml里面添加 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http…

shiro学习(19): 拦截器

1 拦截器介绍 Shiro使用了与Servlet一样的Filter接口进行扩展&#xff1b;所以如果对Filter不熟悉可以参考《Servlet3.1规范》http://www.iteye.com/blogs/subjects/Servlet-3-1了解Filter的工作原理。首先下图是Shiro拦截器的基础类图&#xff1a; 1、NameableFilter Name…

关于云开发新服务“实时数据推送”,你需要了解的全在这了!

“微信小程序工程师邓坤力带你了解如何利用千呼万唤始出来的云开发实时数据推送服务打造生动的小程序和小游戏&#xff01;” 在数据库在小程序云开发中的应用一文中&#xff0c;我们了解到实时数据推送作为云开发即将上线的一项新能力&#xff0c;主要指客户端使用官方SDK发起…

java实现二分查找-两种方式

转:https://blog.csdn.net/maoyuanming0806/article/details/78176957 二分查找是一种查询效率非常高的查找算法。又称折半查找。 起初在数据结构中学习递归时实现二分查找&#xff0c;实际上不用递归也可以实现&#xff0c;毕竟递归是需要开辟额外的空间的来辅助查询。本文就…

shiro学习(20): 自定义过滤规则

工具idea 先看看数据库 shiro_role_permission 数据 shiro_user shiro_user_role 数据 目录结构 在pom.xml里面添加 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http…

css 一些 常用布局

div骨架 Code<div id"header">ss</div> <div id"container"> <div id"content">ss</div> <div id"side">ss</div> </div> <div id"pagefooter"…

shiro学习(21):动态添加验证规则1

工具idea 先看看数据库 shiro_role_permission 数据 shiro_user shiro_user_role 数据 目录结构 在pom.xml里面添加 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http…

shiro学习(22):动态添加验证规则2

工具idea 先看看数据库 shiro_role_permission 数据 shiro_user shiro_user_role 数据 目录结构 在pom.xml里面添加 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http…

shiro学习(23):动态添加验证规则3

工具idea 先看看数据库 shiro_role_permission 数据 shiro_user shiro_user_role 数据 目录结构 在pom.xml里面添加 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http…

借助实时数据推送快速制作在线对战五子棋小游戏丨实战

1 项目概述 游戏开发&#xff0c;尤其是微信小游戏开发&#xff0c;是最近几年比较热门的话题。 本次「云开发」公开课&#xff0c;将通过实战「在线对战五子棋」&#xff0c;一步步带领大家&#xff0c;在不借助后端的情况下&#xff0c;利用「小程序 ✖ 云开发」&#xff0c;…

关于时间复杂度和空间复杂度的计算

转:https://blog.csdn.net/mr_garfield__/article/details/78762478 时间复杂度&#xff1a; 一般情况下&#xff0c;算法中基本操作重复的次数就是问题规模n的某个函数f&#xff08;n&#xff09;&#xff0c;进而分析f&#xff08;n&#xff09;随n的变化情况并确定T&#…

shiro学习(24):Spring的transaction-manager的用法

<?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns:tx"http://www.springframework.org/sche…

Spring Boot----SpringBoot整合 Dubbo 和 Zookeeper

下载安装Zookeeper linux 使用docker部署 windows:参考&#xff08;https://blog.csdn.net/ring300/article/details/80446918&#xff09;&#xff0c;下载的zookeeper目录中需要包含lib&#xff08;内置jar包&#xff0c;否则需要自己导入&#xff09; 1、将conf目录下的zoo_…

visual studio 2005 sp1 安装错误解决

要解决此问题, 请按照下列步骤&#xff1a; 1. 单击 开始 单击 运行 &#xff0c; 键入 控件 secpol.msc , 然后单击 确定 。 2. 双击 本地安全策略 。 3. 单击 软件限制策略 。 注意 如果列出, 没有软件限制右键单击 软件限制策略 , 然后单击 新建策略 。 4. 在 对象类…

递归树求解递归算法的时间复杂度

递归算法时间复杂度的计算方程式一个递归方程&#xff1a; 在引入递归树之前可以考虑一个例子&#xff1a; T(n) 2T(n/2) n2 迭代2次可以得&#xff1a; T(n) n2 2(2T(n/4) (n/2) 2) 还可以继续迭代&#xff0c;将其完全展开可得&#xff1a; T(n) n2 2((n/2) 2 2((n/2…

git(4):git安装教程

1首先找到我们下载好的安装包 2打开安装包 3点击next 4点击next 5点击next 6 点击next 7点击next

基于Cairngorm的Silverlight开发 - part3

使用ModelLocator来管理视图 之前只是简单的介绍了一下ModelLocator的用法&#xff0c;在这里要把模型和视图结合起来&#xff0c;通过模型来来控制视图。在Silverlight中我们可以看到所有新建立的xaml都是继承自UserControl&#xff0c;所以在这里更新欢称视图为控件。至此给出…