日期:2014-05-16 浏览次数:20529 次
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);