利用js的闭包原理做对象封装及调用方法
创建一个js文件,名为testClosure.js:
(function(){ functiona() { alert('iama'); } outFunc=function(){ a(); } })();
这里不论写多少个function,abcd...外面都调用不到,包括这里面var定义的变量也都调用不到,那么你在里面尽情的写,就不用担心这些函数名变量名跟外界冲突;
只需要暴露一个outFunc这个函数供外界调用。这个函数呢没有用var定义,就变成一个全局变量,外界就可以调用的到,利用这一点,让这个函数变成匿名函数和外界沟通的桥梁。
再利用js面向对象的方法,就可以封装出非常好用的组件。
示例一:不需要继承的js组件
(function() { vararrAuthItem=newArray(); varisInited=false; varsyncTableObj=findObj("sync-table-id",document); varnewTR=null; varcheckBox=null; varauthTable=null; varselfPicUrl=null; varselfItem=null; varisAuthItemEnabled=false; varisSelfItemEnabled=false; functiongetAuthShopCurrent() { return$("#"+globalSyncVars.serverComClientId.AuthShopListId).val(); } functiongetSyncFieldCurrent() { return$("#"+globalSyncVars.serverComClientId.SyncFieldListId).val(); } functionsetTitle() { $("#sync-table-title-id").html("从“"+getAuthShopCurrent()+"”同步"); } functiongetNumIidFrom(numIidTo) { varcurRowData=jQuery("#listItemDefine").jqGrid('getRowData',numIidTo); returncurRowData.NumIidFrom; } functioninsertRows() { deleteAll(); for(vari=0;i'; if(getEnabledStatus(isBinded,!isSharedTo,isSelfItemEnabled)) isEnabled=true; strTr+=' '; } authTable.innerHTML=strHead+strTr+''; returnisEnabled; } //返回auth宝贝详情html代码 functiongetAuthItemCode(obj,isSharedFrom,isSharedTo,i) { varlabelStr=""; if(isSharedFrom)labelStr=' '+getRadioCode(isBinded,!isSharedTo,isSelfItemEnabled,i,arr.length)+' '+picUrl+' '+getAuthItemCode(arr[p],isSharedFrom,isSharedTo,i)+' '+getEnabledCode(isBinded,!isSharedTo,isSelfItemEnabled,arr[p],numIid)+' 【源】'; if(isSharedTo)labelStr=' 【受】'; return' '+labelStr+'ID:'+obj["NumIid"]+'' +' 商家编码:'+obj["OuterId"]+'' +' 价格:'+obj["Price"]+'' +' '+obj["Title"]+''; } //返回self宝贝详情html代码 functiongetSelfItemCode(obj) { varlabelStr=""; if(stringToBoolean(obj["IsToItemHasShareFrom"]))labelStr=' 【源】'; if(stringToBoolean(obj["IsToItemHasShareTo"]))labelStr=' 【受】'; return' '+labelStr+'ID:'+obj["NumIidTo"]+'' +' 商家编码:'+obj["OuterIdTo"]+'' +' 价格:'+obj["PriceTo"]+'' +' '+obj["TitleTo"]+''; } //返回绑定关系图标的html代码 functiongetEnabledCode(isBinded,isAuthEnabled,isSelfEnabled,obj,numIid) { if(isBinded) { //如果是绑定状态,还要看当前item是否为绑定的item //在这种情况下,判断是否可绑定,不需要用到selfItem if(obj["NumIid"]==numIid) return' '; else { if(stringToBoolean(obj["IsFromItemHasShareTo"])) return' '; else return' '; } }else { if(isAuthEnabled&&isSelfEnabled) return' '; else return' '; } } //是否可以绑定 functiongetEnabledStatus(isBinded,isAuthEnabled,isSelfEnabled) { if(isBinded)returnfalse; if(isAuthEnabled&&isSelfEnabled) { returntrue; } else { returnfalse; } } //返回radio的html代码 /** *isBinded是否已经绑定 *isAuthEnabledauth是否可同步 *isSelfEnabledself是否可同步 *当前rows的index *当前auth-list的长度(如果是一对一,当然不需要radio) */ functiongetRadioCode(isBinded,isAuthEnabled,isSelfEnabled,i,length) { if(isBinded)return""; if(length==1)return""; if(isAuthEnabled==false||isSelfEnabled==false)return""; return' '; } functionsetterSelfItem(i) { varisEnabled=true; varpicUrl=' '; selfPicUrl.innerHTML=picUrl; selfItem.innerHTML=getSelfItemCode(arrAuthItem[getAuthShopCurrent()+getSyncFieldCurrent()+""][i]); if(stringToBoolean(arrAuthItem[getAuthShopCurrent()+getSyncFieldCurrent()+""][i]["IsToItemHasShareFrom"]))isEnabled=false; if(stringToBoolean(arrAuthItem[getAuthShopCurrent()+getSyncFieldCurrent()+""][i]["IsToItemHasShareTo"]))isEnabled=false; returnisEnabled; } functiongetPriceColor(price,i) { if(arrAuthItem[getAuthShopCurrent()+getSyncFieldCurrent()+""][i]["PriceTo"]==undefined)return"black"; if(price==undefined)return"black"; return(price==arrAuthItem[getAuthShopCurrent()+getSyncFieldCurrent()+""][i]["PriceTo"])?"black":"red"; } functionsetterEnableStatus(isEnabled,i) { if(isEnabled) checkBox.innerHTML=' '; else checkBox.innerHTML=' '; } functionstringToBoolean(str) { if(str==undefined)returnfalse; switch(str.toLowerCase()) { case"true":case"yes":case"1":returntrue; case"false":case"no":case"0":casenull:returnfalse; default:returnBoolean(str); } } functiondeleteAll() { for(vari=syncTableObj.rows.length-1;i>2;i--) { syncTableObj.deleteRow(i); } } functionselectAll(isSelect) { if(isSelect) { $(".enableCheckbox").prop("checked",true); }else { $(".enableCheckbox").prop("checked",false); } } functionfindObj(theObj,theDoc) { varp,i,foundObj; if(!theDoc)theDoc=document; if((p=theObj.indexOf("?"))>0&&parent.frames.length) { theDoc=parent.frames[theObj.substring(p+1)].document; theObj=theObj.substring(0,p); } if(!(foundObj=theDoc[theObj])&&theDoc.all) foundObj=theDoc.all[theObj]; for(i=0;!foundObj&&i 示例二:有继承关系的js组件
(function(){ //____________________________批量修改的基类_________________________________ functionBatchModify(){} //选择了什么id BatchModify.prototype.numIids=null; BatchModify.prototype.addis=null; BatchModify.prototype.oneIid=null; BatchModify.prototype.skuIds=null; BatchModify.prototype.selectedItemData=null; BatchModify.prototype.maxHeightVal=$(window).height()*0.9; //完全克隆一个数组 BatchModify.prototype.cloneArr=function(arr) { vararrNew=[]; for(vari=0;i=0?this.title.substring(4):this.title], colModel:[ {name:'PicUrl',index:'PicUrl',width:60,align:"center",sortable:false,formatter:imgFormatter,unformat:imgUnFormat}, {name:'Title',index:'OuterId',width:430,sortable:true,formatter:itemDescFormatter,unformat:itemDescUnFormat}, {name:'NumIid',index:'NumIid',width:100,hidden:true,key:true}, {name:'Price',index:'Price',width:100,hidden:true}, {name:'OuterId',index:'OuterId',width:100,hidden:true}, {name:this.fieldName,index:this.fieldName,width:440,sortable:true,hidden:false,formatter:this.formatter} ] }); }; //把表格填充进数据 BatchMsgModify.prototype.initTable=function() { vargridArrayData=[]; for(vari=0;i "+rowdata[currentInstance.fieldName]+""; }; //重写post函数 BatchMsgModify.prototype.postData=function(urledit,sender) { $.post(urledit,$("#"+globalVars.serverComClientId.formAldsItemDefine1).serialize()) .done(function(myJsonResult) { vardata=$.evalJSON(myJsonResult); ajaxResponseResult(data); if(data.IsSuccess){ if(!data.rows) showPrompt(currentInstance.title+"成功"+currentInstance.numIids.length+"个!"); $("#listItemDefine").trigger('reloadGrid'); setTimeout(function(){$(sender).dialog("close");},0); setTimeout(function(){$(sender).dialog("destroy");},1000); } if(data.ErrMsg&&$.trim(data.ErrMsg)!="") alert(currentInstance.title+"出错:\n\n"+data.ErrMsg); }) .fail(function(data){ ajaxResponseResult(data); }) .always(function(myJsonResult){ }); }; //确认按钮的回调函数 BatchMsgModify.prototype.confirmCallback=function(sender) { this.setAddis(); this.setNumIidsToCom(); this.setAddisToCom(); this.postData(this.editUrl+"&rdm="+Math.random(),sender); }; //实例 varbatchAddi=null; varbatchMsgTradeSuccess=null; varbatchMsgRatedGood=null; varcurrentInstance=null;//指向当前对象,当this指向失效的时候可以使用这个 openBatchMsgDialogType={batchAddi:0,batchMsgTradeSuccess:1,batchMsgRatedGood:2}; openBatchMsgDialog=function(typeCode) { if(typeCode==openBatchMsgDialogType.batchAddi) { if(batchAddi==null) batchAddi=newBatchMsgModify("批量修改附言","tableEditContent","tablePaper","Additional","x.aspx?method=UpdateMsgAdditional","