<script>
function box(){
var user;
this.getuser=function(){
return user;
}; box.prototype.setuser=function(value){
user=value;
};
}
var b1=new box();
var b2=new box();
var b3=new box();
b1.setuser('www');
alert(b1.getuser());
alert(b2.getuser());
alert(b3.getuser());
</script>
最近在学js面向对象与原型
结果:undefined    undefined     'www'
求大神解释

解决方案 »

  1.   

     function box(){
            var user;
            this.getuser=function(){
                return user;
            };        box.prototype.setuser=function(value){
                user=value;
            };
        }
        var b1=new box();
        var b2=new box();
        var b3=new box();
        b1.setuser('www');
        alert(b1.getuser());
        alert(b2.getuser());
        alert(b3.getuser());b2,b3实例你没调用setuser方法,实例中默认的user的值就是undefined
      

  2.   

    问题是,返回的值是b1,b2 undefined 而b3是'www'啊
      

  3.   

    看错循序。。你的这种写法很少见。一般prototype定义放在函数体外或者使用this.setuser,放到函数体外时操作实例变量结合this对象,要不此时作用域就是window了,操作私有变量使用this.setuser定义方法
    你的prototype放在函数体内,导致每次实力化一个对象的时候,都重新定义了prototype,导致以前已经实例化的对象的prototype定义的方法作用域都被更改为最后一次实例化的对象的,所以很好解释了为什么b3.getuser为b1.setuser设置的值,b1.setuser被修改为b3的了,导致b1.setuser设置的位b3的私有变量user。你更改下b1,b2,b3的实例化循序,如下,这样b2.getuser就会输出www了
     function box(){
            var user;
            this.getuser=function(){
                return user;
            };box.prototype.setuser=function(value){
    user=value;
    };
        }
        var b1=new box();
        var b3=new box();//////
        var b2=new box();//////
        b2.setuser('www');
        alert(b1.getuser());
        alert(b2.getuser());
        alert(b3.getuser());
      

  4.   

    4楼正解,楼主结贴吧。JS中的对象都是引用的方式,你NEW出b3的时候setuser方法它们就用的是同一个了(都是b3的)。。而局部变量确是自己私有的。因此你前两个b1 b2怎么set改的都是b3中局部变量的值。
      

  5.   

    这里面存在闭包的问题,value值永远都是b3的值
      

  6.   


    哥们 我是否能这样理解:这个原型是每个对象都可以用的,然而这个setuser相当于每个对象都有这个方法所以后面的对象把前面的方法给覆盖了,然后在b1上面设置 实际是给b3上设置的????