📄 class.js
字号:
/**
* @fileOverview
* @example
*/
/**
* @class Class
* @constructor
* @param {String} _fqClassName Fully Qualified Class Name
*/ jsx.lang.Class = function(){this.initialize.apply(this, arguments);}
/** @ignore */ jsx.lang.Class.prototype.initialize = function(_fqClassName)
{
jsx.lang.Class.CLASSES[ jsx.lang.Class.CLASSES.length] = _fqClassName;
var _theClass = null;
/** @ignore */
this._pakage = function()
{
return this._getClass().PACKAGE;
}
/** @ignore */
this._className = function()
{
return this._getClass().CLASS;
}
/** @ignore */
this._superClassName = function()
{
return this._getClass().SUPER_CLASS;
}
/** @ignore */
this._classes = function()
{
return this._getClass().IMPORTS;
}
/** @ignore */
this._interfaces = function()
{
return this._getClass().INTERFACES;
}
/** @ignore */
this._mixins = function()
{
return this._getClass().MIXINS;
}
/** @ignore */
this._warnings = function()
{
return this._getClass().WARNINGS;
}
/** @ignore */
this._getClass = function()
{
if(!_theClass)
{
_theClass = eval(_fqClassName);
}
return _theClass;
}
var isPointingToNonEnumProp = function(_prop)
{
return (_prop.indexOf(jsx.lang.Class.PROP_PREFIX)==0 && _prop.lastIndexOf(jsx.lang.Class.PROP_SUFFIX)==(_prop.length-2));
}
var cleanNonEnumProp = function(_prop)
{
var newProp = _prop.replace(jsx.lang.Class.PROP_PREFIX, "");
newProp = newProp.replace(jsx.lang.Class.PROP_SUFFIX, "");
return newProp;
}
var argumentsToParameters = function(_arguments)
{
if(!_arguments || !_arguments.length) return "";
var paramsStr = "";
for(var i=0;i<_arguments.length;i++)
{
if(_arguments[i].getClass().equals(String.klass))
{
paramsStr += "'" + _arguments[i] + "'";
}
else
{
paramsStr += _arguments[i];
}
if(i < (_arguments.length-1)){paramsStr += ", "}
}
return paramsStr;
}
/** @ignore */
this.__toClasses__ = function(_classes)
{
var klasses = [];
for(var i=0;i<_classes.length;i++)
{
klasses[klasses.length] = eval(_classes[i]).klass;
}
return klasses;
}
/** @ignore */
this.__toMethod__ = function(_name, _function)
{
var parse = function(f){
var func = {};
func.name = _name;
func.parameters = [];
func.body = "";
if(f)
{
var s = f.toString();
var params = s.substring(s.indexOf('(')+1, s.indexOf(')'));
if(params)
{
params = params.replace(/\s+/g, "").split(",");
}
for(var i=0;i<params.length;i++)
{
func.parameters[func.parameters.length] = params[i];
}
func.body = (s.substring(s.indexOf('{')+1, s.lastIndexOf('}'))).replace(/(^\s*)|(\s*$)/g, "");
}
return func;
};
var parsedFunc = parse(_function);
return {
name : parsedFunc.name,
parameters : parsedFunc.parameters,
body : parsedFunc.body
};
}
/** @ignore */
this.__toMethdsString__ = function(_methodAry)
{
_methodAry.sort(function(a, b)
{
if(a.getName() < b.getName()) return -1;
if(a.getName() == b.getName()) return 0;
if(a.getName() > b.getName()) return 1;
});
var methodsStr = "";
var j = 1;
for(var i=0;i<_methodAry.length;i++)
{
methodsStr += _methodAry[i].getName();
if(i < (_methodAry.length-1)){methodsStr += ", "}
if(j == 15){methodsStr += "\n"; j=0;}else{j++;}
}
return methodsStr;
}
/** @ignore */
this.__toFieldsString__ = function(_fieldAry)
{
_fieldAry.sort(function(a, b)
{
if(a.getName() < b.getName()) return -1;
if(a.getName() == b.getName()) return 0;
if(a.getName() > b.getName()) return 1;
});
var fieldsStr = "";
var j = 1;
for(var i=0;i<_fieldAry.length;i++)
{
fieldsStr += _fieldAry[i].getName();
if(i < (_fieldAry.length-1)){fieldsStr += ", "}
if(j == 15){fieldsStr += "\n"; j=0;}else{j++;}
}
return fieldsStr;
}
/** @ignore */
this.__getMethods__ = function(declared)
{
var me = this;
var __getMeth__ = function(_prop, _container, isstatic)
{
var meth = {};
meth._$_ = isstatic;
//meth.methodToParse = _container[_prop];
if(isPointingToNonEnumProp(_prop))
{
var nativeProp = cleanNonEnumProp(_prop);
meth.prop = nativeProp;
if(me._className() != "Math")
{
meth.method = eval(me._className()+".prototype")[meth.prop];
}
else
{
meth.method = eval(me._className())[meth.prop];
}
}
else
{
meth.prop = _prop;
meth.method = _container[meth.prop];
}
return meth;
}
var clazz = eval(this._className());
var arry = [];
var cprototype = clazz.prototype;
for(prop in cprototype)
{
if(typeof cprototype[prop] == "function" && jsx.lang.Class.PROTOTYPE_PROPS.indexOf(prop) == -1)
{
if(declared)
{
if(prop == "getClass"){continue;}
if(!cprototype.hasOwnProperty(prop)){continue;}
}
arry[arry.length] = __getMeth__(prop, cprototype, false);
}
}
for(prop in clazz)
{
if(typeof clazz[prop] == "function" && jsx.lang.Class.OBJECT_METHODS.indexOf(prop) == -1)
{
arry[arry.length] = __getMeth__(prop, clazz, true);
}
}
var methods = []
for(var i=0;i<arry.length;i++)
{
methods[methods.length] = {
__meth__ : arry[i].method,
__cmethod__ : this.__toMethod__(arry[i].prop, arry[i].method),
__static__ : arry[i]._$_,
getDeclaringClass : function(){return me;},
getName : function(){return this.__cmethod__.name;},
isStatic : function(){return this.__static__},
getParameters : function(){return this.__cmethod__.parameters;},
getBody : function(){return this.__cmethod__.body;},
invoke : function(_obj, _params)
{
if(!_obj)
{
return eval(me._className()+"."+this.getName()+"("+argumentsToParameters(_params)+")");
}
if(!_params) _params = [];
return this.__meth__.apply(_obj, _params);
}
};
}
return methods;
}
/** @ignore */
this.__getFields__ = function(declared)
{
var me = this;
var __getField__ = function(_prop, _container, isstatic)
{
var field = {};
field._$_ = isstatic;
if(isPointingToNonEnumProp(_prop))
{
var nativeProp = cleanNonEnumProp(_prop);
field.prop = nativeProp;
}
else
{
field.prop = _prop;
}
return field;
}
var clazz = eval(this._className());
var arry = [];
var cprototype = clazz.prototype;
for(prop in cprototype)
{
if(typeof cprototype[prop] != "function")
{
if(declared)
{
if(!cprototype.hasOwnProperty(prop)){continue;}
}
arry[arry.length] = __getField__(prop, cprototype, false);
}
}
for(prop in clazz)
{
if(typeof clazz[prop] != "function" && jsx.lang.Class.CLASS_PROPS.indexOf(prop) == -1)
{
arry[arry.length] = __getField__(prop, clazz, true);
}
}
var fields = []
for(var i=0;i<arry.length;i++)
{
fields[fields.length] = {
__name__ : arry[i].prop,
__static__ : arry[i]._$_,
getDeclaringClass : function(){return me;},
getName : function(){return this.__name__;},
isStatic : function(){return this.__static__},
getValue : function(_obj)
{
if(!_obj)
{
return eval(me._className()+"."+this.getName());
}
return _obj[this.getName()];
}
};
}
return fields;
}
/** @ignore */
this.__newInstance__ = function(args)
{
if(jsx.lang.Class.CORE_CLASSES.indexOf(this._className())==-1)
{
var newObject = eval("new "+this._className()+"()");
newObject.initialize.apply(newObject, args);
return newObject;
}
return eval("new "+this._className()+"("+argumentsToParameters(args)+")");
}
}
/** @ignore */
jsx.lang.Class.CLASS_PROPS = ["prototype", "PACKAGE", "CLASS", "SUPER_CLASS", "IMPORTS", "INTERFACES", "MIXINS", "WARNINGS"];
/** @ignore */
jsx.lang.Class.PROTOTYPE_PROPS = ["constructor", "initialize"];
/** @ignore */
jsx.lang.Class.CORE_CLASSES = ["Array", "Boolean", "Date", "Function", "Math", "Number", "Object", "RegExp", "String"];
/** @ignore */
jsx.lang.Class.OBJECT_METHODS = ["respondsTo", "equals", "_$toString$_", "getClass"];
/** @ignore */
jsx.lang.Class.CLASSES = [];
/** @ignore */
jsx.lang.Class.PROP_PREFIX = "_$";
/** @ignore */
jsx.lang.Class.PROP_SUFFIX = "$_";
/**
* Returns the Class object of the _fqclassName parameter.
* @return {jsx.lang.Class}
*/
jsx.lang.Class.forName = function(_fqclassName)
{
return eval(_fqclassName).klass;
}
/**
* Returns the string name for the class.
* @return {String}
*/
jsx.lang.Class.prototype.getName = function()
{
return this._className();
}
/**
* Returns the super class of this class.
* @return {jsx.lang.Class}
*/
jsx.lang.Class.prototype.getSuperclass = function()
{
if(!this._superClassName())
{
return Object.klass;
}
else
{
return eval(this._superClassName()).klass;
}
}
/**
* Returns an array of Field objects.
* @return {Array}
*/
jsx.lang.Class.prototype.getFields = function()
{
return this.__getFields__(false);
}
/**
* Returns a Field object for this class.
* @example
The Field object has the following methods.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -