日期:2014-05-16  浏览次数:20296 次

自定义原型的一个小问题

var a = function(){}
a.prototype = {
a:1,
b:2,
c:{
  x:1
},
d:[]
}

var b = new a;
var c = new a;

b.a = "b";
c.a = "c";

b.c.x = 3;
c.c.x = 4;


这个时候,可以 b.c 和 c.c 其实是内存指向的相同的地址,改变 b.c 或者 c.c 
这两者都一起被改变了,而改变 b.a 或者 c.a 只改变当前的,也就是 new 的时候
number,string 被new了,object function array 依然没有被new,也依然是一个引用,但是我想实现 new 的时候,下面所有的对象都被new,特别是 object {},也就是改变
b.c.x 不会改变 c.c.x 

通过
for(var name in xx){...}
拷贝过去当然不行,因为这样就不是实现原型了,大量创建的情况下,性能损耗非常大 

有什么好办法吗

我发帖时候就没报多大希望,我知道大部分人会说一大堆道理而不是实际的解决方法,或者就是直接否定了,但我依然期盼着有一个稍微满意一点点的回复 

------解决方案--------------------
成员变量不要在原型对象上定义

var a = function()
{
this.a=1;
this.b=2;
this.c={x:1};
this.d=[];
}

------解决方案--------------------
我很认真的看了5分钟描述,终于看懂楼主要表达的意思。
2L是正确答案。
原型上定义的成员都是所有实例公用的