js重载函数(静态多态)
话不多说,直接上代码Javascript
/** 重载函数类 请使用 OlFunction.create 函数 */
class OlFunction{
/** @type {Array<{parameterType:parameterType,fnc:fnc,codeComments:codeComments}>} 重载函数 */
ols=[];
/** @type {Function} */
defaultFnc;
constructor(){
console.error("使用 OlFunction.create()");
}
/**
* 添加一个重载
* @param {Array} parameterType 形参的类型
* @param {Function} fnc 执行的函数
* @param {String} codeComments 函数的注释, 并没有什么用的参数
*/
addOverload(parameterType,fnc,codeComments){
this.ols.push({parameterType:parameterType,fnc:fnc,codeComments:codeComments});
}
/**
* 创建重载函数
* @param {Function} defaultFnc 当没有和实参对应的重载时默认执行的函数
* @return{OlFunction} 带重载的函数
* 用 .addOverload 添加重载
*/
static create(defaultFnc){
var OverloadFunction=(function(){
return function(){
var i=arguments.length-1,j,flag=false;
for(i=OverloadFunction.ols.length-1;i>=0;--i){
if(arguments.length==OverloadFunction.ols.parameterType.length){
flag=true;
for(j=arguments.length-1;flag&&j>=0;--j){
flag=(arguments.constructor==OverloadFunction.ols.parameterType||arguments instanceof OverloadFunction.ols.parameterType);
}
if(flag)break;
}
}
if(flag){
return OverloadFunction.ols.fnc.apply(this,arguments);
}
else{
return OverloadFunction.defaultFnc.apply(this,arguments);
}
}
})();
OverloadFunction.ols=[];
OverloadFunction.defaultFnc=defaultFnc;
OverloadFunction.addOverload=OlFunction.prototype.addOverload;
return OverloadFunction;
}
} // 使用例
Vector2.baseLinearMapping=OlFunction.create();
/**
* 行向量后乘矩阵
*/
Vector2.baseLinearMapping.addOverload(,function(v,m){
var rtn = new Vector2(
v.x*m.a+v.y*m.c,
v.x*m.b+v.y*m.d
)
return rtn;
},"行向量后乘矩阵");
/**
* 矩阵后乘列向量
*/
Vector2.baseLinearMapping.addOverload(,function(m,v){
var rtn = new Vector2(
v.x*m.a+v.y*m.b,
v.x*m.c+v.y*m.d
);
return rtn;
},"矩阵后乘列向量");
。
/**
* 将时间类型转换成字符串
*/
(function(){
var temp=Date.prototype.toString;
Date.prototype.toString=OlFunction.create(temp);
/**
* @param {String} str 用%{控制字符}{长度}控制打印字符: Y-年 M-月 D-日 d-星期几 h-小时 m-分钟 s-秒 如果没有写长度将使用自动长度, 如果长度超出将在前面补0; 例: %Y6-%M2-%D -> 001970-01-1
*/
Date.prototype.toString.addOverload(,function(str){
var that=this,
d={
Y:that.getFullYear().toString(),
M:(that.getMonth()+1).toString(),
D:that.getDate().toString(),
d:that.getDay().toString(),
h:that.getHours().toString(),
m:that.getMinutes().toString(),
s:that.getSeconds().toString()
}
var i,rtn=[],tstr;
for(i=0;i<str.length;++i){
if(str=='%'){
++i;
if(d]!=undefined){
var ti=parseInt(str),tempstr=[];
if(isNaN(ti)){
tstr=d];
}else{
ti=parseInt(str.slice(i+1))
if(ti>d].length){
do{
tempstr.push('0');
--ti;
}while(ti>d].length)
}
tempstr.push(d].slice(d].length-ti));
i+=ti.toString().length;
tstr=tempstr.join('');
}
// }else if(str=='%'){
// tstr='%'
}else{
tstr='%'+str;
}
}else{
tstr=str;
}
rtn.push(tstr);
}
return rtn.join('');
},"用%{控制字符}{长度}控制打印字符: Y-年 M-月 D-日 d-星期几 h-小时 m-分钟 s-秒 如果没有写长度将使用自动长度; 例: %Y-%M2-%D -> 1970-01-1");
})();
使用例2 重载Date的toString函数
页:
[1]