在 Javascript 类中使用 setTimeout & 带参数的window.setTimeout(参数可为对象)

最近遇到了一道 Javascript 考题,内容如下:

尝试实现注释部分的 Javascript 代码,可在其他任何地方添加更多
代码(如不能实现,说明一下不能实现的原因):

var  Obj  =   function (msg) {
this.msg = msg;
this.shout = function(){
alert(
this.msg);
}
 

this.waitAndShout = function(){
// 隔五秒钟后执行上面的 shout 方法
}

}


var  testObj  =   new  Obj( " Hello,World! " );
testObj.shout();
坦白的说,之前我并没有在 Javascript 类中使用 setTimeout
/ setInterval 的经验,所以开始就很草率的认为这是无法实现的。但是经过深思熟虑以后发现是可以实现的。退一步说,隔五秒执行某段语句是非常容易实现的。比如不考虑别的因素,题目中的函数是可以这样写:

this .waitAndShout  =   function () {
setTimeout(
'this.shout()'5000);
}

在运行以后,谁都会意识到 
this  这个变量是无法找到的。但是这是为什么呢,很快就可以意识到,其实 setTimeout / setInterval 是 window 对象的一个方法,所以也可以写成 window.setTimeout / window.setInterval,那么上述的  this .shout() 就非常可以容易理解为什么不能执行了,因为它实际上调用的是 window.shout() 。

知道了原因以后解决起来就非常的容易了,只要将对象绑定到 window 对象下就可以(我对 Javascript 有趣的对象机制感到兴奋)。那么,上述的函数再做一个小的修改:

this .waitAndShout  =   function ()  {
window.Obj 
= this;
setTimeout(
'Obj.shout()'5000);
}

这样就可以了。实际上

setTimeout(
' Obj.shout() ' 5000 );
等价于

window.setTimeout(
' window.Obj.shout() ' 5000 );
另外,之前我也想到将对象保存为数组,然后引用调用,代码如下:

function  ObjectClass (property)  {
this.property = property;
this.id = ObjectClass.cnt;
ObjectClass.objects[ObjectClass.cnt
++= this;
this.method = ObjectClass_method;
}


ObjectClass.cnt 
=   0 ;
ObjectClass.objects 
=   new  Array();

function  ObjectClass_method ()  {
setTimeout(
'ObjectClass.objects[' + this.id + '].method();'5000);
}


var  obj1  =   new  ObjectClass( ' feelinglucky ' );
obj1.method();
不过个人感觉还是上述第一种方法清晰得多。

后记,Javascript 看来的确还是很多需要谨慎对待的地方,尤其是对象机制。就犹如我之前所说的,Javascript 并不比其他语言要复杂,但是它也没有你想象中的简单。

PS:完成这道题目以后, Google 发现其他的兄弟早已经解决了此类的问题,比如这里还有这里,可以对比参考一下。


--------------------------------------------------------------------------------

更新,感谢 Sheneyan 兄弟的提醒,还有另外的一个办法就是通过 Closure(闭包) 来实现,代码如下:

var  Obj  =   function (msg) {
this.msg = msg;
this.shout = function() {
alert(
this.msg);
this.waitAndShout();
}


var _self = this;
this.waitAndShout = function() {
setTimeout(
function(){_self.shout()}5000);
}

}


var  testObj  =   new  Obj( " Hello,World! " );
testObj.shout();
看来这道题已经不能再害人了 :
^ )

这里是《在 Javascript 类中使用 setTimeout》的 永久连接(Permalink),欢迎您 留言 或发送 Trackback。您也可以查看此篇文章的 Wap 版本(适用于移动设备)。最后,如果您对本站的内容感兴趣,欢迎您 订阅本站。 
上一篇:jQuery 如何检测浏览器及版本 下一篇: 对某项目失败的思考 
2008 - 01 - 25   11 : 27 : 11  手气不错
@fdcn 非常感谢提点

2008 - 01 - 25   01 : 23 : 52  fdcn
闭包是对的,但要避免循环中产生匿名函数

var  Obj  =   function (msg) {
this.msg = msg;
var _self=this;
var shout=this.shout = function() {
alert(_self.msg);
_self.waitAndShout();
}


this.waitAndShout = function() {
setTimeout(shout, 
1000);
}

}


var  testObj  =   new  Obj( " Hello,World! " );
testObj.shout();

 

 

< script language = " javascript " >     
/**/ /*   
    功能:修改 window.setTimeout,使之可以传递参数和对象参数   
    使用方法: setTimeout(回调函数,时间,参数1,,参数n)   
*/
   
var  __sto  =  setTimeout;    
window.setTimeout 
=   function (callback,timeout,param) {    
    
var args = Array.prototype.slice.call(arguments,2);    
    
var _cb = function(){    
        callback.apply(
null,args);    
    }
    
    __sto(_cb,timeout);    
}
    
   
// /测试代码    
function  aaaa(a) {    
    alert(a);    
}
    
   
function  aaaaa(a,b,c) {    
    alert(a 
+ b + c);    
}
    
   
var  a  =   new  Object();    
window.setTimeout(aaaa,
1000 ,a);    
window.setTimeout(aaaaa,
2000 ,a, 6 , 7 );    
</ script >    

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值