runTimer: function() { // execute your own code here // keep timer running setTimeout(function(t) { t.runTimer(); }, 1000/30, this); }
A collection of handy code snippets in the languages that I use on a daily basis.
December 8, 2010
Javascript: Prototype.js - keep a timer running and maintain scope
If you create a Class with the Prototype.js class system, and you want to keep a timer running (for animation or other purposes), use this function to maintain the proper "this" scope:
Labels:
javascript,
js,
Prototype.js,
scope,
settimeout,
timer
December 1, 2010
Javascript: Prototype.js Class system isolated into one file
I wanted to isolate the Class system from Prototype so I could use it with other libraries. I like the way it works, especially the inheritance features. You can copy and paste this into your own class.js file, and use the Prototype.js class system just like you would if you had the whole library included in your page. Check it out:
/* From object.js ------------------------------ */ Object.prototype.getType = function(o) { switch(o) { case null: return 'Null'; case (void 0): return 'Undefined'; } var type = typeof o; switch(type) { case 'boolean': return 'Boolean'; case 'number': return 'Number'; case 'string': return 'String'; } return 'Object'; }; Object.prototype.keys = function(object) { if (this.getType(object) !== 'Object') { alert('type error'); } var results = []; for (var property in object) { if (object.hasOwnProperty(property)) { results.push(property); } } return results; }; Object.prototype.isFunction = function(object) { return Object.prototype.toString.call(object) === '[object Function]'; }; Object.prototype.isUndefined = function(object) { return typeof object === "undefined"; }; Object.prototype.extend = function(destination, source) { for (var property in source) destination[property] = source[property]; return destination; }; /* From array.js ------------------------------ */ function $A(iterable) { if (!iterable) return []; // Safari <2.0.4 crashes when accessing property of a node list with property accessor. // It nevertheless works fine with `in` operator, which is why we use it here if ('toArray' in Object(iterable)) return iterable.toArray(); var length = iterable.length || 0, results = new Array(length); while (length--) results[length] = iterable[length]; return results; }; /* From function.js ------------------------------ */ Function.prototype.argumentNames = function() { var names = this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1] .replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, '') .replace(/\s+/g, '').split(','); return names.length == 1 && !names[0] ? [] : names; }; // patched with inline helpers from function.js Function.prototype.bind = function(context) { if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this; var __method = this, args = Array.prototype.slice.call(arguments, 1); function update(array, args) { var arrayLength = array.length, length = args.length; while (length--) array[arrayLength + length] = args[length]; return array; } function merge(array, args) { array = Array.prototype.slice.call(array, 0); return update(array, args); } return function() { var a = merge(args, arguments); return __method.apply(context, a); } }; // patched with inline helper from function.js Function.prototype.wrap = function(wrapper) { function update(array, args) { var arrayLength = array.length, length = args.length; while (length--) array[arrayLength + length] = args[length]; return array; } var __method = this; return function() { var a = update([__method.bind(this)], arguments); return wrapper.apply(this, a); } }; /* From class.js ------------------------------ */ /* Based on Alex Arnell's inheritance implementation. */ /* Refer to Prototype's web site for a [tutorial on classes and inheritance (http://prototypejs.org/learn/class-inheritance). */ var Class = (function() { // Some versions of JScript fail to enumerate over properties, names of which // correspond to non-enumerable properties in the prototype chain var IS_DONTENUM_BUGGY = (function(){ for (var p in { toString: 1 }) { // check actual property name, so that it works with augmented Object.prototype if (p === 'toString') return false; } return true; })(); function subclass() {}; function create() { var parent = null, properties = $A(arguments); if (Object.isFunction(properties[0])) parent = properties.shift(); function klass() { this.initialize.apply(this, arguments); } Object.extend(klass, Class.Methods); klass.superclass = parent; klass.subclasses = []; if (parent) { subclass.prototype = parent.prototype; klass.prototype = new subclass; parent.subclasses.push(klass); } for (var i = 0, length = properties.length; i < length; i++) klass.addMethods(properties[i]); if (!klass.prototype.initialize) klass.prototype.initialize = Prototype.emptyFunction; klass.prototype.constructor = klass; return klass; } function addMethods(source) { var ancestor = this.superclass && this.superclass.prototype, properties = Object.keys(source); // IE6 doesn't enumerate `toString` and `valueOf` (among other built-in `Object.prototype`) properties, // Force copy if they're not Object.prototype ones. // Do not copy other Object.prototype.* for performance reasons if (IS_DONTENUM_BUGGY) { if (source.toString != Object.prototype.toString) properties.push("toString"); if (source.valueOf != Object.prototype.valueOf) properties.push("valueOf"); } for (var i = 0, length = properties.length; i < length; i++) { var property = properties[i], value = source[property]; if (ancestor && Object.isFunction(value) && value.argumentNames()[0] == "$super") { var method = value; value = (function(m) { return function() { return ancestor[m].apply(this, arguments); }; })(property).wrap(method); value.valueOf = method.valueOf.bind(method); value.toString = method.toString.bind(method); } this.prototype[property] = value; } return this; } return { create: create, Methods: { addMethods: addMethods } }; })();
Labels:
javascript,
js,
OOP,
Prototype.js
Subscribe to:
Posts (Atom)