在js中如何实现设计模式中的模板方法? 
思路的产生必然要求熟悉js,如何实现?就很简单了,都知道在js中如果定义两个相同名称的方法,前一个方法就会被后一个方法覆盖掉,使用此特点就可以实现模板方法。
例如在实际的项目中有很多页面操作的步骤基本相同,但局部细节却不一样。例如在我所在的项目中,就有很多展示数据库记录的页面,每个页面都存在读取记录,查询记录,增加删除,修改记录等相同的操作,但对应的后台方法却不一样。 
复制代码 代码如下:
 
function ListCommon2() { 
var urlAdd; 
var urlAjax; 
var tableid; 
var titleText=""; 
var winid = "#win"; 
var columns; 
var toolbars; 
var queryParams; 
var colkey; 
var toolbarsType 
this.initList = function (aurlAdd, aurlAjax, atableid, atitleText, awinid, acolumns, atoolbarsType) { 
urlAdd = aurlAdd; 
urlAjax = aurlAjax; 
if (atableid) { 
tableid = atableid; 
} 
if (atitleText) { 
titleText = atitleText; 
} 
if (atitleText) { 
winid = awinid; 
} 
columns = acolumns; 
toolbarsType = atoolbarsType; 
}; 
this.initData = function () { 
if (!toolbarsType) { 
toolbars = [{ text: '添加', iconCls: 'icon-add', handler: Add }, '-', { text: '编辑', iconCls: 'icon-edit', handler: this.Edit } 
, '-', { text: '删除', iconCls: 'icon-cancel', handler: this.delMsg } 
]; 
} else { 
toolbars = toolbarsType; 
} 
queryParams = this.GetqueryParams(); 
$(tableid).datagrid({ 
url: urlAjax + '?OperationType=list', 
columns: columns, 
toolbar: toolbars, 
idField: colkey, 
pagination: true, 
pageSize: 20, 
sortName: colkey, 
sortOrder: 'desc', 
rownumbers: true, fitColumns: true, 
striped: true, 
method: "post", 
striped: true, 
queryParams: this.GetqueryParams(), 
showFooter: true 
, pageList: [10, 20, 30, 40, 50] 
}); 
$("#add").click(function (e) { 
Add(); 
}) 
$("#edit").bind('click', { obj: this }, function (event) { 
event.data.obj. Edit(); 
}) 
$("#del").bind('click', { obj: this }, function (event) { 
event.data.obj.delMsg(); 
}) 
$("#btnQuery").bind('click', { obj: this }, function (event) { 
var queryParamsnew = event.data.obj.GetqueryParams(); 
$(tableid).datagrid('load', queryParamsnew) 
}) 
} 
this.GetqueryParams = function () { 
var NameList = this.Getcolsinfo(); 
var otherQueryParams = this.GetOtherQueryParams(); 
if (!otherQueryParams) { 
return { colkey: colkey, colsinfo: NameList } 
} 
else { 
return otherQueryParams; 
} 
} 
this.GetOtherQueryParams = function () { 
return null; 
} 
this.Getcolsinfo = function () { 
var fieldNameList = []; 
if (columns.length > 0) { 
for (var i = 0; i < columns[0].length; i++) { 
fieldNameList.push(columns[0][i].field); 
} 
} 
else { 
alert("未绑定数据"); 
} 
colkey = fieldNameList[fieldNameList.length-1]; 
var NameList = fieldNameList.join(","); 
return NameList 
} 
function Add() { 
var _content = '<iframe frameborder="0" src=' + urlAdd + ' ></iframe>'; 
$(winid).dialog({ 
width: 600, 
height: 400, 
modal: true, 
content: _content, 
title: "增加" + titleText, 
draggable: true, 
resizable: true, 
shadow: true, 
minimizable: false 
}); 
} 
this.Edit = function (editId) { 
var id; var obj = typeof (editId); 
if (!editId || obj == "object") { 
var items = $(tableid).datagrid('getSelections'); 
var length = items.length; 
if (length == 0) { 
$.messager.alert('提示', '请选择一条记录然后编辑'); 
return; 
} else if (length > 1) { 
$.messager.alert('提示', '由于一次只能编辑一条记录,所以只能修改第一条记录'); 
return; 
} 
id = GetId(items[0]); 
} 
else { 
id = editId; 
} 
var _content = '<iframe frameborder="0" src=' + urlAdd + '?Id=' + id + ' ></iframe>'; 
$(winid).dialog({ 
width: 600, 
height: 400, 
modal: true, 
content: _content, 
title: "修改" + titleText, 
draggable: true, 
resizable: true, 
shadow: true, 
minimizable: false 
}); 
} 
this.windowclose = function () { 
$(winid).window('close'); 
} 
this.SaveOkCallback = function () { 
this.windowclose(); 
$(tableid).datagrid('reload'); 
$(tableid).datagrid('unselectAll'); 
} 
this.delMsg = function (delId) { 
var length = 1; 
var id; 
var items; var obj = typeof (delId); 
if (!delId || obj == "object") { 
items = $(tableid).datagrid('getSelections'); 
length = items.length; 
if (length == 0) { 
$.messager.alert('提示', '请至少选择一条记录然后删除'); 
return; 
} 
} 
else { 
id = delId; 
} 
var text = '你确认删除' + length + '条记录吗?'; 
if (length == 1) { 
text = '你确认删除该条记录吗?'; 
} 
$.messager.confirm('提示', text, function (r) { 
if (r) { 
if (!delId) { 
var idList = []; 
$.each(items, 
function (key, value) { 
var id = GetId(value); // in case we're changing the key 
idList.push(id); 
}); 
id = idList.join(","); 
} 
del(id) 
} 
}); 
} 
function del(id) { 
$.ajax({ type: "post", 
url: urlAjax + "?OperationType=del&id=" + id, 
success: function (msg) { 
var obj = jQuery.parseJSON(msg); 
if (obj.IsSuccess == true) { 
$.messager.alert('提示', obj.Msg); 
selectcallback(); 
} 
else { 
$.messager.alert('提示', obj.Msg); 
} 
} 
}); 
} 
function selectcallback() { 
SaveOkCallback(); 
} 
} 
仔细看看就会发现,这段代码就包含了,查询,修改,添加,删除等几乎所有的操作,但由于查询条件传递的参数不同,所以有一个需要重写的方法this.GetOtherQueryParams
根据不同的页面重写就可以了。
例如如下一个页面的重写:
复制代码 代码如下:
