在js的类内部,可以通过this访问本身,但是,javascript中的定时器函数setTimeout和setInterval后面的参数是函数名字符串,也就是要setInterval(“func”,delay)或者setTimeout(“func”,delay)。虽然是在类内部设置定时器(timer),但是对于这两个函数,在类的内部也是一样,必须把它看成是在外部调用一样。
在外部调用的话就比较简单了: setInterval(“objname.func()”,delay)或者setTimeout(“objname.func()”,delay)就可以了。但是问题就出在这里了,我们在类内部并不知道所创建的对象的名字,对象的名字只有在创建了之后才可以得到。
下面举一个简单的例子
function Car(){ if (typeof Car._initialized == "undefined") { Car.prototype.drive = function() { alert('Drive'); } Car._initialized = true; } setTimeout("this.drive()",1000); } var car = new Car();
运行后,你会得到一个错误
Uncaught TypeError: Object [object global] has no method 'drive'
下面的代码将在类内部获取到当前所创建对象,具体如下
//产生一个随机的字符串用做ID,这里用"obj_"加时间戳的方式 this.id="obj_"+new Date().getTime(); //这一句eval就相当于在obj_xxx(这是外部的变量)=this(对象本身) eval(this.id+"=this");
修改后的类如下:
function Car(){ //产生一个随机的字符串用做ID,这里用"obj_"加时间戳的方式 this.id = "obj_"+new Date().getTime(); //这一句eval就相当于在obj_xxx(这是外部的变量)=this(对象本身) eval(this.id+"=this"); if (typeof Car._initialized == "undefined") { Car.prototype.drive = function() { alert('Drive'); } Car._initialized = true; } setTimeout(this.id+".drive()",1000); } var car = new Car();
在javascript的类中加入上面的代码后,此时外部声明了一个var objname=new someClass,那么这个obj_xxx也就指向objname了,对于上面的代码来说,Car类中的this.id就指向外部的变量car了。
转载请注明:知识蚂蚁 » js类内部定时器如何调用类内部函数
茅塞顿开啊,等于拿时间戳这个全局变量保存了实例本身