【分享】基本上实现 javascript 的 OOP
// framework.js 代码如下:
// Author: Wan Changhua // version: 2003.120401
// 环境变量初始化 if(typeof($js_home)=="undefined")$js_home="/common/jslib/"; // 定义 js home path if(typeof($js_runMode)=="undefined")$js_runMode="run"; // 定义 run mode (run|debug)
// 定义实现 OOP 的相关方法
Function.prototype._extends=function(jsclass) { // 获得 className var _s=this.toString().replace("function",""); _s=_s.substring(0,_s.indexOf("(")).replace(/ /g,"");
if(typeof(jsclass)=="string") { var cls=JSClass.forName(jsclass); if(cls!=null)jsclass=cls; } if(typeof(jsclass)!="function") { _throw(new Error(1002,"Framework/_extends:"+_s+" 继承异常{"+jsclass+"不是合法类}")); } var _p=this.prototype=new jsclass(); // 原型继承 this._base=jsclass; this._super=jsclass.prototype; _p.className=_s; return _p; // 返回原型 }; Function.prototype._implements=function(jsclass){};//接口 Function.prototype.className="Object";
// 系统函数 function _typeof(name) { var _type=false; eval('_type=typeof('+name+')'); return (_type); } function _defined(cName) { var cs=cName.split("."); var pn=null; for(var i=0;i<cs.length;i++) { if(i==0)pn=cs[i]; else pn+="."+cs[i]; if(_typeof(pn)!="function") { return false; } } return true; } function _throw(ex,dspt) { if(typeof(ex)!="object")ex=new Error(ex,dspt); if($js_runMode=="debug") { if(_import("system.Console"))system.Console.out.printError(ex); } throw ex; }
// 定义包的相关实现
function _package(pkname) { var pkNames=pkname.split("."); var pn=null; for(var i=0;i<pkNames.length;i++) { if(i==0)pn=pkNames[i]; else pn+="."+pkNames[i]; if(_typeof(pn)!="function") { var _s="function "+pn+"(){}"; window.execScript(_s,"JavaScript"); } } }
function _import(pkname) { var pkPath=pkname.replace(/\./gi,"/"); if(pkPath.substring(pkPath.length-1)=="*") { // TODO 解决 _imprt(system.*) ; } else { if(_defined(pkname))return true; //避免重复 import pkPath=$js_home+pkPath+".js"; var xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); xmlHttp.open("GET",pkPath,false); xmlHttp.send(); if(xmlHttp.status!=200) { _throw(new Error(1003,"Framework/_import:没有找到 "+pkname+" 类")); } try{ _package(pkname); var _jssrc=""; _jssrc=VBS_Bytes2BSTR(xmlHttp.responseBody); // _jssrc=xmlHttp.responseText; window.execScript(_jssrc,"JavaScript"); }catch(ex) { _throw(new Error(1004,"Framework/_import:"+pkname+" 类加载异常{"+ex.description+"}")); } return true; } }
// 定义包类 Package
function JSPackage(){} // 标示类 - 尚未定义任何方法
// 定义基类 JSClass
function JSClass() { // TODO } var p=JSClass.prototype; JSClass.forName=function(className) { var _class=null; if(_typeof(className)=="function") { eval("_class="+className); } return _class; }
// UTF-8 to GB2312 window.execScript(''+ 'Function VBS_Bytes2BSTR(srcStr) \n'+ ' Dim i \n'+ ' strReturn = "" \n'+ ' For i = 1 To LenB(srcStr) \n'+ ' tmpChr = AscB(MidB(srcStr,i,1)) \n'+ ' If tmpChr < &H80 Then \n'+ ' strReturn = strReturn & Chr(tmpChr) \n'+ ' Else \n'+ ' NextCharCode = AscB(MidB(srcStr,i+1,1)) \n'+ ' strReturn = strReturn & Chr(CLng(tmpChr) * &H100 + CInt(NextCharCode)) \n'+ ' i = i + 1 \n'+ ' End If \n'+ ' Next \n'+ ' VBS_Bytes2BSTR = strReturn \n'+ 'End Function','VBScript');
// 标示 framework 加载成功 var $JSFramework=true;
// -- js define end
例子: 定义一个类: 文件名 Example.js 放到 $js_home/cn/x86/data/ 目录中
_package ("cn.x86.data");
_import("system.JSObject");
function cn.x86.data.Example() { this.toString=function(){ return ("cn_x86_Example"); } } cn.x86.data.Example._extends("system.JSObject");
// 别的地方用到这个类时 可这样用:
_import("cn.x86.data.Example"); var a=new cn.x86.data.Example(); alert(a.toString());
不能通过 <script src=..js></script> 这种方式引用, 只能通过 _import("类名") 这种方式! 切记 (会java的人应该很容易理解我的这套framework)
对于 js 的 OO ,很多人都比较深的见解。 我这里只不过做了一下总结,参照 java的方法, 使 js 的OO 方便且规范一些。有不足之处,望大家指正! 
|