首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

:关于JS模拟类的有关问题

2012-03-21 
请教各位:关于JS模拟类的问题JScript codefunction test(){var a 0this.b 1test.c 2}var k new

请教各位:关于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);

热点排行