Prototype中的类的创建,一般使用Class.create方法来创建,例如PeriodicalExecuter类型。使用的时候通过调用new PeriodicalExecuter(xxx)来生成对象。
1 /** 2 * 一个设计精巧的定时执行器 3 * 首先由 Class.create() 创建一个 PeriodicalExecuter 类型, 4 * 然后用对象直接量的语法形式设置原型。 5 * 6 * 需要特别说明的是 rgisterCallback 方法,它调用上面定义的函数原型方法bind, 并传递自己为参数。 7 * 之所以这样做,是因为 setTimeout 默认总以 window 对象为当前对象,也就是说,如果 registerCallback 方法定义如下的话: 8 * registerCallback: function() { 9 * setTimeout(this.onTimerEvent, this.frequency * 1000); 10 * } 11 * 那么,this.onTimeoutEvent 方法执行失败,因为它无法访问 this.currentlyExecuting 属性。 12 * 而使用了bind以后,该方法才能正确的找到this,也就是PeriodicalExecuter的当前实例。 13 */ 14 var PeriodicalExecuter = Class.create(); 15 PeriodicalExecuter.prototype = { 16 initialize: function(callback, frequency) { 17 this.callback = callback; 18 this.frequency = frequency; 19 this.currentlyExecuting = false; 20 21 this.registerCallback(); 22 }, 23 24 registerCallback: function() { 25 setTimeout(this.onTimerEvent.bind(this), this.frequency * 1000); 26 }, 27 28 onTimerEvent: function() { 29 if (!this.currentlyExecuting) { 30 try { 31 this.currentlyExecuting = true; 32 this.callback(); 33 } finally { 34 this.currentlyExecuting = false; 35 } 36 } 37 38 this.registerCallback(); 39 } 40 }
具体Class.create()背后做了什么,具体来看看Class的实现。