mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
ef10672364
git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@92488 467b73ca-7a2a-4603-9d3b-597d59a354a9
67 lines
1.6 KiB
JavaScript
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;
|
|
})(); |