解决方案 »

  1.   

    info是fun的原型属性,a,b2个新对象指向同一个原型,所以结果就是一样的,2次赋值都是给原型属性赋值,后面的覆盖前面的
      

  2.   

    那这样呢?
    var fun = function(){}fun.prototype = {    
    name : 'peter',    
    age : 25    
    }var a = new fun();
    var b = new fun();a.name = 'jack';
    b.name = 'tom';
      

  3.   

    var fun = function(){}fun.prototype = {    
    name : 'peter',    
    age : 25    
    }var a = new fun();
    var b = new fun();a.name = 'jack';
    b.name = 'tom';这样的结果是完全不同的。
      

  4.   

    var fun = function(){}fun.prototype = {
    info : {
    name : 'peter',
    age : 25
    }
    }var a = new fun();
    var b = new fun();//此时a与b一样是复制了fun的属性和方法(不共享,但是空的,因为fun()是空的)可以打印证明:
    console.log(a.toSource());//({})
    console.log(b.toSource());//({})=======================分割线======================
    a.info.name = 'jack';
    b.info.name = 'tom';//而fun.prototype继承而来的方法和属性同样继承给a,b。他们是共享的,所以修改.info.name大家一起修改。
    //但a,b因由fun创建出来,已经没有prototype属性,但他们有__proto__属性一样可以指向到fun.prototypeconsole.log(a.prototype);//undefined
    console.log(a.__proto__ === fun.prototype);//trueconsole.log(a.__proto__.info.name === b.info.name);//true
    console.log(a.info.name === fun.prototype.info.name);//true=======================分割线======================
    a.name = 'jack';
    b.name = 'tom';
    //这又不一样了,是各自建了一个属性,和复制fun的属性一样,不共享。等价于:
    var fun = function(name){
        this.name = name;
    };fun.prototype = {
        info : {}
    };var a = new fun('jack');
    var b = new fun('tom');console.log(a.toSource());//({name:"jack"})
    console.log(b.toSource());//({name:"tom"})