aboutsummaryrefslogtreecommitdiffstats
path: root/lib/utils.js
diff options
context:
space:
mode:
authorPhil Crosby2012-04-29 22:04:35 -0700
committerPhil Crosby2012-04-29 22:04:35 -0700
commite1caed5b35997302d6b3ac14137f8374216057c6 (patch)
treede9e1043458dd08aa40f8361c7ab64f6162b2738 /lib/utils.js
parent1abee7d66f68da2b48d88832eea4e2d045cc1b0b (diff)
downloadvimium-e1caed5b35997302d6b3ac14137f8374216057c6.tar.bz2
Introduce a way to group code into classes.
We can choose a simpler implementation in the near future.
Diffstat (limited to 'lib/utils.js')
-rw-r--r--lib/utils.js64
1 files changed, 64 insertions, 0 deletions
diff --git a/lib/utils.js b/lib/utils.js
index 7ed7c9ad..ca7ce2bc 100644
--- a/lib/utils.js
+++ b/lib/utils.js
@@ -159,3 +159,67 @@ var utils = {
},
};
+
+/*
+ * Simple JavaScript Inheritance, by John Resig.
+ * This provides a short syntax for organizing code into classes.
+ * Taken from http://ejohn.org/blog/simple-javascript-inheritance/.
+ */
+(function(){
+ var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
+ // The base Class implementation (does nothing)
+ this.Class = function(){};
+
+ // Create a new Class that inherits from this class
+ Class.extend = function(prop) {
+ var _super = this.prototype;
+
+ // Instantiate a base class (but only create the instance,
+ // don't run the init constructor)
+ initializing = true;
+ var prototype = new this();
+ initializing = false;
+
+ // Copy the properties over onto the new prototype
+ for (var name in prop) {
+ // Check if we're overwriting an existing function
+ prototype[name] = typeof prop[name] == "function" &&
+ typeof _super[name] == "function" && fnTest.test(prop[name]) ?
+ (function(name, fn){
+ return function() {
+ var tmp = this._super;
+
+ // Add a new ._super() method that is the same method
+ // but on the super-class
+ this._super = _super[name];
+
+ // The method only need to be bound temporarily, so we
+ // remove it when we're done executing
+ var ret = fn.apply(this, arguments);
+ this._super = tmp;
+
+ return ret;
+ };
+ })(name, prop[name]) :
+ prop[name];
+ }
+
+ // The dummy class constructor
+ function Class() {
+ // All construction is actually done in the init method
+ if ( !initializing && this.init )
+ this.init.apply(this, arguments);
+ }
+
+ // Populate our constructed prototype object
+ Class.prototype = prototype;
+
+ // Enforce the constructor to be what we expect
+ Class.prototype.constructor = Class;
+
+ // And make this class extendable
+ Class.extend = arguments.callee;
+
+ return Class;
+ };
+})();