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

js原型方法问题
JScript code
<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'
求大神解释



------解决方案--------------------
看错循序。。

你的这种写法很少见。一般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了
JScript code
 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());