Javascript玩转Prototype(一)——先谈C#原型模式
2010-09-14 13:46:24 来源:WEB开发网然后我们初始化一个对象:
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。敬请关注。
Tags:Javascript Prototype 原型
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接