function test(){
    var a = 0;
    this.b = 1;
    test.c = 2;
}
var k = new test();
k.a;
k.b;
k.c;貌似第一个是undefined,后面两个是正常的,这里有个疑问,new关键是不是新建一个test()函数的副本么,test函数不是包括a的么,new的时候没有把a也new进去么,看过很多关于js面向对象的文章,基本都差不多,好像都没有讲原理啊,求各位帮忙解答,多谢各位。

解决方案 »

  1.   

    当然了,this就代表当前的类,即test。this.b和test.c代表test类中的属性 b、c。
    var k = new test() 定义一个test类的一个实体k,这样k对象就有了 b、c属性了,用k.b和k.c可以调用。
    在方法中var定义的只是一个局部的变量,离开该方法就失去作用域了,在这个不管你把test看着类还是方法,a都只是一个局部变量只在方法内部访问,所以即使k对象是test的实体对象也无法访问。
      

  2.   

    模拟类, 函数名通常大写
    function Test(){
    this.a = 1;
    this.b = 2;
    this.c = 3
    }构造函数里面用  this.XXX;
    外面用new Test();
      

  3.   

    1、a体现的是函数作用域的问题,var a只在test内部才能访问到,一般可以用来模拟私有属性或者方法。
    2、b是this的一个“属性”,主要是看如何去初始化test,由于函数可以invoke as function或者invoke as constructor,这两种,this指向的对象会不同。
    3、如果把test看作是一个函数,那么c只是test的一个属性而已,new操作符不会影响到c,也不会把c指向k的某个属性。new test时具体做了什么工作?可以这么看var x = {}
    x.__prop__ = test.prototype;
    var val = test.call(x);
    if(typeof val == 'object'){
        return val;
    }
    return x;
    你的例子里,k最终指向了x
      

  4.   

    function test(){
        var a = 0; // 私有变量,在test 内部有效
        this.b = 1;
        test.c = 2;
    }
      

  5.   


    那如果我这么写function Test(){
        var a = 0;
        this.b = function(){
            alert(a);
        }
    }
    var k = new Test();
    k.b();//弹出“0”这样是不是就是说a在k中也存在一个副本?
      

  6.   

    a是有的,私有成员,类外面方位角不到而已,当然是我们也是有办法能访问到的
     function test(){
        var a = 0;
        this.b = 1;
        test.c = 2;//这个写法等效理解是为test类添加的成员,当然在js里面把test也看作对象才是正确理解,所以这个成员与test构造的对象无关
        this.geta=function(){return a;}
    }
    var k = new test();
    alert(k.geta());//用对象的成员方法就可以访问到私有成员了;
    alert(k.b);
    alert(test.c);
      

  7.   

    不是的,k.b()是条用k对象的b方法(行为),至于能输出0是因为在b方法中使用到了a,且b方法在a的作用域内,所以b方法就可以使用a,不过这个调用是内部的调用(此过程是暗箱操作,不属于k的行文,k也就无法获知了),a不属于任何一个对象,他就是个内部变量离开该方法后立马被释放(不管k有没有被释放),b会随着k的释放同事被释放掉。