diff options
| author | Phil Crosby | 2012-04-29 22:04:35 -0700 | 
|---|---|---|
| committer | Phil Crosby | 2012-04-29 22:04:35 -0700 | 
| commit | e1caed5b35997302d6b3ac14137f8374216057c6 (patch) | |
| tree | de9e1043458dd08aa40f8361c7ab64f6162b2738 /lib/utils.js | |
| parent | 1abee7d66f68da2b48d88832eea4e2d045cc1b0b (diff) | |
| download | vimium-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.js | 64 | 
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; +  }; +})();  | 
