分享
 
 
 

基本上实现 javascript 的 OOP

王朝html/css/js·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有