来自john resig
( function (argument) {
var initialzing = false;
var fnTest = /\b_super\b/;
//this is window, and this statement let live Class in window
this.Class = function (){};
//create a new class that inherits this class
Class.extend = function ( prop ) {
var _super = this.prototype;
initialzing = true;
var prototype = new this();
initialzing = false;
for ( var name in prop ) {
var haveSuper = typeof prop[ name ] == "function" && typeof _super[ name ] == "function" && fnTest.test( prop[ name ] )
if ( haveSuper ) {
prototype[ name ] = ( function ( name , fn ) {
return function () {
var tmp = this._super;
this._super = _super[ name ];
var ret = fn.apply( this , arguments );
this._super = tmp;
return ret;
};
} ) ( name , prop[ name ] );
} else {
prototype[ name ] = prop[ name ];
}
}
function Class () {
if ( !initialzing && this.init )
this.init.apply( this , arguments );
}
Class.prototype = prototype;
Class.prototype.constructor = Class;
Class.extend = arguments.callee;
return Class;
};
} )();
var Person = Class.extend({
init: function(isDancing){
this.dancing = isDancing;
},
dance: function(){
return this.dancing;
}
});
var Ninja = Person.extend({
init: function(){
this._super( false );
},
dance: function(){
return this._super();
},
swingSword: function(){
return true;
}
});
var p = new Person(true);
p.dance(); // => true
var n = new Ninja();
n.dance(); // => false
n.swingSword(); // => true
// Should all be true
p instanceof Person && p instanceof Class && n instanceof Ninja && n instanceof Person && n instanceof Class