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

📄 class.js

📁 Browser independent JavaScript SDK. ClassLoader to lazy load JavaScript classes, extensions to core
💻 JS
📖 第 1 页 / 共 2 页
字号:
/*
 * JavaScript Software Development Kit - what JavaScript should be and can be - js-sdk.sourceforge.net
 * Copyright (C) 2006-2007 Mathew Sheets
 *
 * == BEGIN LICENSE ==
 *
 * Licensed under the terms of any of the following licenses at your
 * choice:
 *
 *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
 *    http://www.gnu.org/licenses/lgpl.html
 *
 * == END LICENSE ==
 */

package jsx.lang;

class Class
{
	/**
	* @fileOverview
	* @example
	*/
	/**
	* @class Class
	* @constructor
	* @param {String} _fqClassName Fully Qualified Class Name
	*/
	Class(_fqClassName)
	{
		Class.CLASSES[ 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(Class.PROP_PREFIX)==0 && _prop.lastIndexOf(Class.PROP_SUFFIX)==(_prop.length-2));
		}

		var cleanNonEnumProp = function(_prop)
		{
			var newProp = _prop.replace(Class.PROP_PREFIX, "");
			newProp = newProp.replace(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" && 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" && 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" && 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(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 */
	Class.CLASS_PROPS = ["prototype", "PACKAGE", "CLASS", "SUPER_CLASS", "IMPORTS", "INTERFACES", "MIXINS", "WARNINGS"];
	/** @ignore */
	Class.PROTOTYPE_PROPS = ["constructor", "initialize"];
	/** @ignore */
	Class.CORE_CLASSES = ["Array", "Boolean", "Date", "Function", "Math", "Number", "Object", "RegExp", "String"];
	/** @ignore */
	Class.OBJECT_METHODS = ["respondsTo", "equals", "_$toString$_", "getClass"];

	/** @ignore */
	Class.CLASSES = [];

	/** @ignore */
	Class.PROP_PREFIX = "_$";
	/** @ignore */
	Class.PROP_SUFFIX = "$_";

	/**
	* Returns the Class object of the _fqclassName parameter.
	* @return {jsx.lang.Class}
	*/
	static forName(_fqclassName)
	{
		return eval(_fqclassName).klass;
	}

	/**
	* Returns the string name for the class.
	* @return {String}
	*/
	instance getName()
	{
		return this._className();
	}

	/**
	* Returns the super class of this class.
	* @return {jsx.lang.Class}
	*/
	instance getSuperclass()
	{
		if(!this._superClassName())
		{
			return Object.klass;
		}
		else
		{
			return eval(this._superClassName()).klass;
		}
	}

	/**

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -