以构造函数和原型法重新实现定时器封装
上篇文章实现了“使用工厂模式和闭包实现定时器封装”,
http://www.cnblogs.com/lightsong/p/3703045.html
本文记录以构造函数和原型法对其重新实现。
构造函数
创建对象,包括定义 var obj = {}、 工厂创建、 和 构造函数。
工厂创建即在创建函数中, 定义对象, 并给对象赋属性和方法, 最后return出此对象。
构造函数,类似Java中类的构造函数, 函数中, 使用this.xxx 来定义属性和方法,此处的this表示实例化时候的对象,
实例化语句 var obj = new constructor(args)。
构造函数改造出定时器
直接上代码,即在所有的属性和方法前添加this., 实现的功能与工厂一致:
<html> <head> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> </head> <body> <label>timer msg :</label> </br> <textarea id="timer_msg" style="width:500px; height:300px"></textarea> <script> $.fn.extend({printMsg : function(msg){ var oldmsg = $(this).val(); var newmsg = oldmsg + "\n" + msg; $(this).val(newmsg); }}); var __nativeST__ = window.setTimeout; window.setTimeout = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) { var oThis = this, aArgs = Array.prototype.slice.call(arguments, 2); return __nativeST__(vCallback instanceof Function ? function () { vCallback.apply(oThis, aArgs); } : vCallback, nDelay); }; function timer(fnAlarmIn, options) { /* external settable */ this.timeout = 1000; this.fnAlarm = function(){ $("#timer_msg").printMsg(this.timerHandle.toString() + "-please add custom fnAlarm") }; /* inner maintain variable */ this.timerHandle; this.timerObj; /* set external variable */ if ( fnAlarmIn ) { this.fnAlarm = fnAlarmIn; } if ( options && options.timeout ) { this.timeout = options.timeout; } this.start = function(){ this.timerHandle = setTimeout.call(this, function(){ $("#timer_msg").printMsg(this.getTimerID() + "-->timer triggered"); this.fnAlarm.call(this); delete this.timerHandle; }, this.timeout); $("#timer_msg").printMsg(this.timerHandle.toString() + "-timer started"); }; this.stop = function(){ $("#timer_msg").printMsg(this.timerHandle.toString() + "-timer stoped"); clearTimeout(this.timerHandle) delete this.timerHandle; }; this.getTimerID = function(){ return this.timerHandle; }; } var timer1 = new timer(); timer1.start(); timer1.stop(); var timer2 = new timer(function(){ $("#timer_msg").printMsg("timer custom alarm"); }, {timeout:2000}); timer2.start(); var timer3 = new timer(function(){ $("#timer_msg").printMsg(timer3.getTimerID()+"-timer custom alarm"); }, {timeout:3000}); timer3.start(); var timer4 = new timer(function(){ $("#timer_msg").printMsg(this.getTimerID()+"-timer custom alarm"); }, {timeout:4000}); timer4.start(); </script> </body> </html>
构造函数中定义对象的方法, 为每个对象独有, 实际上此方法应该属于每个对象共有。
一来浪费内存,二来不符合对象行为抽象的逻辑。此问题就需要原型方法解决。
原型方法
原型 prototype,就是定义构造函数中,对象公共方法的手段,
例如原型为 function constructor(){}; constructor.prototype.hello = function(){console.log("hello")}
则任何实例化的对象 var a = new constructor(); 都可以调用 a.hello();
原型方法优化构造函数实现的定时器
直接上代码,功能与构造函数一致:
<html> <head> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> </head> <body> <label>timer msg :</label> </br> <textarea id="timer_msg" style="width:500px; height:300px"></textarea> <script> $.fn.extend({printMsg : function(msg){ var oldmsg = $(this).val(); var newmsg = oldmsg + "\n" + msg; $(this).val(newmsg); }}); var __nativeST__ = window.setTimeout; window.setTimeout = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) { var oThis = this, aArgs = Array.prototype.slice.call(arguments, 2); return __nativeST__(vCallback instanceof Function ? function () { vCallback.apply(oThis, aArgs); } : vCallback, nDelay); }; function timer(fnAlarmIn, options) { /* external settable */ this.timeout = 1000; this.fnAlarm = function(){ $("#timer_msg").printMsg(this.timerHandle.toString() + "-please add custom fnAlarm") }; /* inner maintain variable */ this.timerHandle; this.timerObj; /* set external variable */ if ( fnAlarmIn ) { this.fnAlarm = fnAlarmIn; } if ( options && options.timeout ) { this.timeout = options.timeout; } } timer.prototype.start = function(){ this.timerHandle = setTimeout.call(this, function(){ $("#timer_msg").printMsg(this.getTimerID() + "-->timer triggered"); this.fnAlarm.call(this); delete this.timerHandle; }, this.timeout); $("#timer_msg").printMsg(this.timerHandle.toString() + "-timer started"); }; timer.prototype.stop = function(){ $("#timer_msg").printMsg(this.timerHandle.toString() + "-timer stoped"); clearTimeout(this.timerHandle) delete this.timerHandle; }; timer.prototype.getTimerID = function(){ return this.timerHandle; }; var timer1 = new timer(); timer1.start(); timer1.stop(); var timer2 = new timer(function(){ $("#timer_msg").printMsg("timer custom alarm"); }, {timeout:2000}); timer2.start(); var timer3 = new timer(function(){ $("#timer_msg").printMsg(timer3.getTimerID()+"-timer custom alarm"); }, {timeout:3000}); timer3.start(); var timer4 = new timer(function(){ $("#timer_msg").printMsg(this.getTimerID()+"-timer custom alarm"); }, {timeout:4000}); timer4.start(); </script> </body> </html>
出处:http://www.cnblogs.com/lightsong/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
标签:
JavaScript
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)