# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. /** * lang.js - Some missing JavaScript language features */ /** * Partially applies a function to a particular "this object" and zero or * more arguments. The result is a new function with some arguments of the first * function pre-filled and the value of |this| "pre-specified". * * Remaining arguments specified at call-time are appended to the pre- * specified ones. * * Usage: * var barMethBound = BindToObject(myFunction, myObj, "arg1", "arg2"); * barMethBound("arg3", "arg4"); * * @param fn {string} Reference to the function to be bound * * @param self {object} Specifies the object which |this| should point to * when the function is run. If the value is null or undefined, it will default * to the global object. * * @returns {function} A partially-applied form of the speficied function. */ this.BindToObject = function BindToObject(fn, self, opt_args) { var boundargs = fn.boundArgs_ || []; boundargs = boundargs.concat(Array.slice(arguments, 2, arguments.length)); if (fn.boundSelf_) self = fn.boundSelf_; if (fn.boundFn_) fn = fn.boundFn_; var newfn = function() { // Combine the static args and the new args into one big array var args = boundargs.concat(Array.slice(arguments)); return fn.apply(self, args); } newfn.boundArgs_ = boundargs; newfn.boundSelf_ = self; newfn.boundFn_ = fn; return newfn; } /** * Inherit the prototype methods from one constructor into another. * * Usage: * * function ParentClass(a, b) { } * ParentClass.prototype.foo = function(a) { } * * function ChildClass(a, b, c) { * ParentClass.call(this, a, b); * } * * ChildClass.inherits(ParentClass); * * var child = new ChildClass("a", "b", "see"); * child.foo(); // works * * In addition, a superclass' implementation of a method can be invoked * as follows: * * ChildClass.prototype.foo = function(a) { * ChildClass.superClass_.foo.call(this, a); * // other code * }; */ Function.prototype.inherits = function(parentCtor) { var tempCtor = function(){}; tempCtor.prototype = parentCtor.prototype; this.superClass_ = parentCtor.prototype; this.prototype = new tempCtor(); }