silverstripe-framework/thirdparty/jquery-concrete/jquery.class.js
2009-11-21 02:26:09 +00:00

67 lines
1.6 KiB
JavaScript

/**
* Very basic Class utility. Based on base and jquery.class.
*
* Class definition: var Foo = Base.extend({ init: function(){ Constructor }; method_name: function(){ Method } });
*
* Inheritance: var Bar = Foo.extend({ method_name: function(){ this._super(); } });
*
* new-less Constructor: new Foo(arg) <-same as-> Foo(arg)
*/
Base = (function(){
var marker = {}, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
// The base Class implementation (does nothing)
Base = function(){};
Base.addMethod = function(name, func) {
var _super = this._super;
if (_super && fnTest.test(func)) {
this.prototype[name] = function(){
var tmp = this._super;
this._super = _super[name];
try {
var ret = func.apply(this, arguments);
}
finally {
this._super = tmp;
}
return ret;
}
}
else this.prototype[name] = func;
}
// Create a new Class that inherits from this class
Base.extend = function(prop) {
// The dummy class constructor
var Kls = function() {
if (arguments[0] === marker) return;
if (this instanceof Kls) {
if (this.init) this.init.apply(this, arguments);
}
else {
var ret = new Kls(marker); if (ret.init) ret.init.apply(ret, arguments); return ret;
}
}
Kls.constructor = Kls;
Kls.extend = Base.extend;
Kls.addMethod = Base.addMethod;
Kls._super = this.prototype;
Kls.prototype = new this(marker);
// Copy the properties over onto the new prototype
for (var name in prop) {
if (typeof prop[name] == 'function') Kls.addMethod(name, prop[name]);
else Kls.prototype[name] = prop;
}
return Kls;
};
return Base;
})();