⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 class.js

📁 Browser independent JavaScript SDK. ClassLoader to lazy load JavaScript classes, extensions to core
💻 JS
📖 第 1 页 / 共 2 页
字号:
	/**
	* @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 + -