小弟刚学Javascript不久,最近看书遇到一个问题,有些疑问
我创建了一个构造函数
function Person() {}
Person.prototype = {
    name:"aaa",
    array:["a","b","c"],
}然后实例化两个对象
var person1 = new Person();
var person2 = new Person();person1.name = "bbb";
alert(person1.name) //"bbb",书上说这个会覆盖原型中的name
person1.array.push("d");
alert(person1.array);//"a,b,c,d",这里有些不理解,前面说新创建的相同属性会覆盖原型,但是这里为什么没有呢?我试了一下,
person1.array = new Array();
person1.array.push("m");
alert(person1.array);//"m",这里得到了想要的结果是不是person1.name是一个副本,所以修改以后可以覆盖原型中的属性,而person1.array是原型属性的一个引用而非副本,所以修改以后原型中的也被修改了?请问大侠们,我这样分析是否正确?多谢各位帮助~~~

解决方案 »

  1.   

    person1.array.push("d");
    alert(person1.array);//"a,b,c,d",这里有些不理解,前面说新创建的相同属性会覆盖原型,但是这里为什么没有呢?请问 那你认为应该是打印出什么值呢。
      

  2.   

    person1.array.push("d");这是给数组新增个元素啊。。alert"a,b,c,d"没有错啊。。
    你如果
    person1.array="d";
    那自然覆盖了。
      

  3.   

    呵呵 在理解原型之前 
    你应该做的是了解下Array push的用法
      

  4.   

    呃,我忘了说
    如果
    alert(person2.array);  这里也输出"a,b,c,d"
    就是修改了person1的实例,person2的实例也受影响了
      

  5.   

    function Person(){};
    Person.prototype.arr = [1,2,3];
    var b = {
        arr = Person.prototype.arr;
    };
    var c = {
        arr = Person.prototype.arr;
    };
    b.arr.push(5);
    alert(c.arr);new 的实际操作是从函数的prototype上拷贝一份添加到新对象上。
    这里有解释其中关于原型链的解释还有待考究。
    对于Array、Function、Object等类型的拷贝,实际上是拷贝的地址,而不是创建一个新的。
    如果需要初始化的属性如果是按地址传递的,那么就在构造函数内部创建吧。function Person(){
        this.arr = [];
    };