也就是说,我将js,分为公用部分和非公有部分两个文件,非公有js部分每个分行对应一个。
可是遇到了强大的难题:
1:如何界定公用js,后续范围变化了怎么半?代码如何维护?难道要所有分行都要修改嘛,不可能。
2:如何知道我要调用哪个分行的非公有js?这个倒可以通过后面的方法实现。
3:如何重写公用js里面的js方法?
也许还有问题,但到此,这个方案也只得放弃。非常的不现实的,维护代价很高,实现难度也不低,外加实现架构乱!
2.事已至此,唯有实现客户端OOP框架了
A. 基类的实现
使用ProtoType原型实现,并且加入了一个简单的伪名称空间。
文件名字remit.0000.js
//创建一个名称空间BEGIN
var sdc;
if (!sdc) sdc = {};
else if (typeof sdc != "object")
throw new Error("sdc already exists and is not an object, error at remit.0000.js");
if (!sdc.RemitBase) sdc.RemitBase=Class.create();//创建基类!
//创建一个名称空间END
//下面就是给基类增加方法了
Object.extend(sdc.RemitBase.prototype, {
initialize: function() {//此方法必须有
},
payuseOnChanged: function(form, payuseSel, otherField)
{
…………
},
getPayuseInfo:function()
{
…………
},
feecurrtypeOnChange:function(feeObjName){
currConstrainOnChange('*' + feeObjName);
this.showRemitCurType();
},
outAcctOnChangeExtraHandler : function () //各分行自定义附加函数 在remitFun里重写就行了
{
},
outCurrTypeOnChangeExtraHandler : function () //各分行自定义附加函数 在remitFun里重写就行了
{
},
conPageInit : function () //确认页面和OK调用的初始化函数
{
}
…………//其他公用方法
});
B. 子类的实现
我的文件命名规则是remit.地区号.js
var sdc;
if (!sdc) sdc = {};
else if (typeof sdc != "object")
throw new Error("sdc already exists and is not an object, error at remit.js");
var RemitFun = Class.create();
Object.extend(RemitFun.prototype, sdc.RemitBase.prototype);//继承基类
Object.extend(RemitFun.prototype, {//覆盖基类的方法,增加自己的方法
initialize: function() {
},
// Event Handler for inArea
inAreaOnChangedHadler : function (source)
{
…………
},
conPageInit : function () //这里就是覆盖的基类方法。
{
}
});
C. 多态的实现。这里用了一个小技巧。
当时想了几天也没想出来,因为js的运行时怎么可能支持多态呢-_-! 但是,我想到了一个替代的方法,就是依托服务器来实现多态!其实就是:应用服务器能够知道此时需要的子类(分行特定js文件)是什么,让它给发送到浏览器就行了!
实际上只需要一句代码就解决了。但确实很关键,没有这个伪多态是不行的。
这句宝贵的代码就是:
<script type="text/javascript" src="<%=webpath%>js/pages/remit/remit.<icbc:label controlID="jsFilePathInfo" />.js"></script>
红色的代码实际上就是地区号了。
三、总结
至此,汇款的逻辑部分通过以上形式的组织,将他们大部分都装入了js文件。应用了面向对象的方法,实际效果真是出人意料,很不错。
1. 消灭了重复代码,提升了复用性。
2. 可维护性高。由于继承方法,使得新增代码变少了。
3. 代码的灵活性高,逻辑清晰。
这些优点提升了开发的进度,间接的也减少了出错的几率