【分享】基本上实现 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 方便且规范一些。有不足之处,望大家指正!