日期:2014-05-16 浏览次数:20424 次
var $class = (function(){ var guid = 0, classMap = {}, caller = null, callStack = []; return { create : createClass } //------------------------[辅助函数部分]------------------------ /** * 创建新类. * @param {constructor}superClass 超类构造器,该类必须由$class.create创建 * @param {Json}proto 类原型 * @return {constructor} */ function createClass(superClass, proto){ var isSuperValid = superClass instanceof Function && superClass.prototype && superClass.prototype.init instanceof Function; superClass = isSuperValid ? superClass : null; var superProto = superClass ? superClass.prototype : null; //定义类构造函数 var klass = function() { var args = [].slice.call(arguments); //执行父类构造函数. if(superClass){ superClass.apply(this, args); } //若自己的原型中有init方法,执行init if(klass.prototype.hasOwnProperty('init')){ klass.prototype.init.apply(this, args); } }; //定义类原型 var klassProto = getClassProto(superProto, proto); klassProto.constructor = klass; klass.prototype = klassProto; //返回类 return klass; } /** * 获取类原型. * @param {json}superProto 超类原型 * @param {Json}overwrites 需要重写方法 * @return {json} */ function getClassProto(superProto, overwrites) { var i, F, proto, classId = getGuid(); if(superProto){ F = function(){}; F.prototype = superProto; proto = new F(); }else{ proto = getDefaultProto(); } //用overwrites中方法覆盖原型中的方法 for(i in overwrites){ if(overwrites.hasOwnProperty(i)){ proto[i] = overwrites[i]; } } //修复IE中for in不能遍历toString、valueOf等属性的Bug if(document.all){ var len, method, methods = ['toString', 'valueOf']; for(i=0, len = methods.length; i < len; i++){ method = methods[i]; if( overwrites.hasOwnProperty(method) ){ proto[method] = overwrites[method]; } } } //注册类关系 proto.classId = classId; regClass(proto, superProto); //确保原型中含有必要的原型方法 addMastHasMethods(proto); return proto; } /** * 获取默认原型. * @return {json} */ function getDefaultProto(){ return { init : function(){}, callSuper : callSuper }; } /** * 调用超类方法. * @param {String}methodName 方法名 * @return */ function callSuper(methodName){ caller = (caller === null ? this : caller);