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

请教各位:关于JS模拟类的问题
JScript code

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面向对象的文章,基本都差不多,好像都没有讲原理啊,求各位帮忙解答,多谢各位。

------解决方案--------------------
当然了,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的实体对象也无法访问。
------解决方案--------------------
模拟类, 函数名通常大写
function Test(){
this.a = 1;
this.b = 2;
this.c = 3
}

构造函数里面用 this.XXX;
外面用new Test();
------解决方案--------------------
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时具体做了什么工作?可以这么看
JScript code

var x = {}
x.__prop__ = test.prototype;
var val = test.call(x);
if(typeof val == 'object'){
    return val;
}
return x;

------解决方案--------------------
function test(){
var a = 0; // 私有变量,在test 内部有效
this.b = 1;
test.c = 2;
}
------解决方案--------------------
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);