代码如下:
<script type="text/javascript">
function test(){}
test.prototype.name = "abc";
var a = [];
for(var i=0;i<10;i++)
{
a[i] = new test();
}
test.prototype.name = "ABC";//注意此时实例已经创建完成,按理说和test已经没有关系了。
for(var i=0;i<10;i++)
{
alert(a[i].name);
}
</script>所有的实例的name属性都改变了。如果属性是实例的话,这个如果实例很多的话,肯定有性能问题。所谓的属性是不是实质上也是函数的调用,你使用a元素的name属性时,实际上是调用了,test的一个函数,返回大写的ABC。

解决方案 »

  1.   

    new 对象() 并不是copy对象,而是添加一个新的对象引用.
    当对象引用中的属性值没有在当前实例下被改变时,他的值一直是指向原对象例如
    a[2].name="changed";
    test.prototype.name = "ABC";
    alert(a[2].name) //返回changed,非ABC
      

  2.   

    新的对象引用是什么意思?
    var a = new A();
    var b = new A();
    a和b是同一对象吗?
      

  3.   

    var a = new A();
    a.prototype.name = "A";
    var str = a.name;
    a.name = "abc";
    前一个a.name和后一个a.name其实并不是一回事,前者实际上是A.prototype.name。
    这种语法真是怪呀。
      

  4.   

    其实就是 原型连
    A本身没有name属性
    会到A的原型连上找 也就是A.prototype但是如果A有name属性  就用a本身的name属性
      

  5.   

    它就像是那个类的各个实体中存放了一个指针,那个指针指向那个prototype中的属性
    按照你的那个程序来说,a[]数组中,
    被初始化后每个实体中都有一个指针链接到test.prototype.name所以a[0],a[1]...它们本身是没name属性的,
    但是你如果要从a[0],a[1]中读name属性,系统它们会根据原型链自动先在a[0],a[1]的域中找,有没有name属性,有的话就读出,没有的话就去a[0],a[1]的所属的prototype中寻找有没有name属性,如果没有再往上找prototype的prototype中有没有name属性,一直找根部,也就是object.
    当然你如果往a[0]或者a[1]中写name属性,它的情况就不一样了,
    它不会覆盖a[0],a[1]的prototype中的name属性值,而是会自动的在a[0],a[1]自身域中分配内存空间创建name这个属性,这样子就和prototype中的name属性无关了.总之一句话,对某类对象的protoype来说,
    "要读东西,好!你可以来拿我的!但是要修改东西,你们只能修改自己身上的,不能改我的."