- 浏览: 5101809 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
silence19841230:
先拿走看看
SpringBoot2.0开发WebSocket应用完整示例 -
wallimn:
masuweng 写道发下源码下载地址吧!三个相关文件打了个包 ...
SpringBoot2.0开发WebSocket应用完整示例 -
masuweng:
发下源码下载地址吧!
SpringBoot2.0开发WebSocket应用完整示例 -
masuweng:
SpringBoot2.0开发WebSocket应用完整示例 -
wallimn:
水淼火 写道你好,我使用以后,图标不显示,应该怎么引用呢,谢谢 ...
前端框架iviewui使用示例之菜单+多Tab页布局
转自:http://www.cnblogs.com/simayixin/archive/2011/03/28/1997519.html
我们从结果向实现推,首先看我们要实现什么样的效果:
css(hi,"color","red")
css([hi,hello],"color","red")
css(hi,{"border":"1px solid #000","width":"200px"})
var color = css(hi,"color")
这是很常见的写法,然后看我们希望怎么写:
Overload("css",window,
{
"object,string,string" : function(el,key,val){
el.style[key] = val;
}
,"array,string,string" : function(els,key,val){
for(var i=0;i<els.length;i++){
els[i].style[key] = val;
}
}
,"object,object" : function(el,kv){
for(var i in kv){
el.style[i] = kv[i];
}
}
,"object,string" : function(el,key){
return el.style[key];
}
});
接下来,看实现:
/*
JavaScript函数重载模拟
name : 函数名
bind : 函数需要绑定到的对象
fn_objs : 键值对函数对象,键位以逗号隔开的类型(number,string,object,undefined,boolean,array,*)字符串,其中*为万能类型,值为对应的函数,
如:{"string,string":function(x,y){},"string,number":functioin(x,y){}}
*/
var Overload = function(name,bind,fn_objs){
var dict_name = "_"+name+"_dict",dict;
dict = bind[dict_name] = bind[dict_name] || {};
for(var i in fn_objs){
dict[i] = fn_objs[i];
}
var is_match = function(x,y){
if(x==y)return true;
if(x.indexOf("*")==-1)return false;
var x_arr = x.split(","),y_arr = y.split(",");
if(x_arr.length != y_arr.length)return false;
while(x_arr.length){
var x_first = x_arr.shift(),y_first = y_arr.shift();
if(x_first!="*" && x_first!=y_first)return false;
}
return true;
};
bind[name] = function(){
var args = arguments,args_len = args.length,args_types=[],args_type,match_fn = function(){};
for(var i=0;i<args_len;i++){
var type = typeof args[i];
type=="object" && (args[i] instanceof Array) && (type="array");
args_types.push(type);
}
args_type = args_types.join(",");
for(var k in dict){
if(is_match(k,args_type)){
match_fn = dict[k];
break;
}
}
return match_fn.apply(this,args);
};
};
因为采用typeof来动态监测参数类型,而typeof又只能检测到的值只有(number,string,object,undefined,boolean),所以类型的制定只能从这些值中设定,实现中还加入了万能类型"*",由于array属于常用类型, 所以又特别添加了对array类型的支持。
基本原理是:将以类型串为键,函数为值的字典挂到需要绑定的对象上,命名为"_"+fn_name+"_dict",可用bind["_"+fn_name_"_dict"]来访问此对象,接着生成一个函数,在函数里靠判断arguments生成的类型串来从上述字典中匹配到相应的函数。
------------------------------------------------------------------------------------------------------------------
上面的写法 ,始终不好看,有如下改进:
Overload = function(fn_objs){
var is_match = function(x,y){
if(x==y)return true;
if(x.indexOf("*")==-1)return false;
var x_arr = x.split(","),y_arr = y.split(",");
if(x_arr.length != y_arr.length)return false;
while(x_arr.length){
var x_first = x_arr.shift(),y_first = y_arr.shift();
if(x_first!="*" && x_first!=y_first)return false;
}
return true;
};
var ret = function(){
var args = arguments
,args_len = args.length
,args_types=[]
,args_type
,fn_objs = args.callee._fn_objs
,match_fn = function(){};
for(var i=0;i<args_len;i++){
var type = typeof args[i];
type=="object" && (args[i].length>-1) && (type="array");
args_types.push(type);
}
args_type = args_types.join(",");
for(var k in fn_objs){
if(is_match(k,args_type)){
match_fn = fn_objs[k];
break;
}
}
return match_fn.apply(this,args);
};
ret._fn_objs = fn_objs;
return ret;
};
String.prototype.format = Overload({
"array" : function(params){
var reg = /{(\d+)}/gm;
return this.replace(reg,function(match,name){
return params[~~name];
});
}
,"object" : function(param){
var reg = /{([^{}]+)}/gm;
return this.replace(reg,function(match,name){
return param[name];
});
}
});
我们从结果向实现推,首先看我们要实现什么样的效果:
css(hi,"color","red")
css([hi,hello],"color","red")
css(hi,{"border":"1px solid #000","width":"200px"})
var color = css(hi,"color")
这是很常见的写法,然后看我们希望怎么写:
Overload("css",window,
{
"object,string,string" : function(el,key,val){
el.style[key] = val;
}
,"array,string,string" : function(els,key,val){
for(var i=0;i<els.length;i++){
els[i].style[key] = val;
}
}
,"object,object" : function(el,kv){
for(var i in kv){
el.style[i] = kv[i];
}
}
,"object,string" : function(el,key){
return el.style[key];
}
});
接下来,看实现:
/*
JavaScript函数重载模拟
name : 函数名
bind : 函数需要绑定到的对象
fn_objs : 键值对函数对象,键位以逗号隔开的类型(number,string,object,undefined,boolean,array,*)字符串,其中*为万能类型,值为对应的函数,
如:{"string,string":function(x,y){},"string,number":functioin(x,y){}}
*/
var Overload = function(name,bind,fn_objs){
var dict_name = "_"+name+"_dict",dict;
dict = bind[dict_name] = bind[dict_name] || {};
for(var i in fn_objs){
dict[i] = fn_objs[i];
}
var is_match = function(x,y){
if(x==y)return true;
if(x.indexOf("*")==-1)return false;
var x_arr = x.split(","),y_arr = y.split(",");
if(x_arr.length != y_arr.length)return false;
while(x_arr.length){
var x_first = x_arr.shift(),y_first = y_arr.shift();
if(x_first!="*" && x_first!=y_first)return false;
}
return true;
};
bind[name] = function(){
var args = arguments,args_len = args.length,args_types=[],args_type,match_fn = function(){};
for(var i=0;i<args_len;i++){
var type = typeof args[i];
type=="object" && (args[i] instanceof Array) && (type="array");
args_types.push(type);
}
args_type = args_types.join(",");
for(var k in dict){
if(is_match(k,args_type)){
match_fn = dict[k];
break;
}
}
return match_fn.apply(this,args);
};
};
因为采用typeof来动态监测参数类型,而typeof又只能检测到的值只有(number,string,object,undefined,boolean),所以类型的制定只能从这些值中设定,实现中还加入了万能类型"*",由于array属于常用类型, 所以又特别添加了对array类型的支持。
基本原理是:将以类型串为键,函数为值的字典挂到需要绑定的对象上,命名为"_"+fn_name+"_dict",可用bind["_"+fn_name_"_dict"]来访问此对象,接着生成一个函数,在函数里靠判断arguments生成的类型串来从上述字典中匹配到相应的函数。
------------------------------------------------------------------------------------------------------------------
上面的写法 ,始终不好看,有如下改进:
Overload = function(fn_objs){
var is_match = function(x,y){
if(x==y)return true;
if(x.indexOf("*")==-1)return false;
var x_arr = x.split(","),y_arr = y.split(",");
if(x_arr.length != y_arr.length)return false;
while(x_arr.length){
var x_first = x_arr.shift(),y_first = y_arr.shift();
if(x_first!="*" && x_first!=y_first)return false;
}
return true;
};
var ret = function(){
var args = arguments
,args_len = args.length
,args_types=[]
,args_type
,fn_objs = args.callee._fn_objs
,match_fn = function(){};
for(var i=0;i<args_len;i++){
var type = typeof args[i];
type=="object" && (args[i].length>-1) && (type="array");
args_types.push(type);
}
args_type = args_types.join(",");
for(var k in fn_objs){
if(is_match(k,args_type)){
match_fn = fn_objs[k];
break;
}
}
return match_fn.apply(this,args);
};
ret._fn_objs = fn_objs;
return ret;
};
String.prototype.format = Overload({
"array" : function(params){
var reg = /{(\d+)}/gm;
return this.replace(reg,function(match,name){
return params[~~name];
});
}
,"object" : function(param){
var reg = /{([^{}]+)}/gm;
return this.replace(reg,function(match,name){
return param[name];
});
}
});
发表评论
-
gradle编译错误:Could not find method compile() for arguments
2020-09-19 10:50 18185编译(IDEA+Gradle)一个别人的工程,出现一个 ... -
netty心跳检查之UDP篇
2019-09-15 08:50 2122部分UDP通信场景中,需要客户端定期发送心跳信息,以获取终 ... -
解决tomcat部署两个SpringBoot应用提示InstanceAlreadyExistsException
2019-06-30 11:49 3169两个SpringBoot应用部署在一个Tomcat中,单独 ... -
Eclipse配置MyBatis代码自动化功能
2019-06-29 10:16 16411.安装插件 Eclipse中,Help->Ecli ... -
vue.js中使用qrcode生成二维码
2019-05-20 00:00 7561一、安装包 npm install qrcodejs2 --s ... -
MySQL插入数据报错: Incorrect string value: '\xFD\xDE'
2019-03-31 23:19 1174我MySQL数据库用的uft-8字符集,插入数据一直很正常 ... -
vue自定义组件并双向绑定属性
2019-03-08 22:46 3209做了两个子组件,原理基本一样,一个是使用原生的select ... -
vue-router简单示例
2019-03-05 00:32 1089写个基本完整、稍有借鉴意义的示例,防止自己忘记。 &l ... -
“联通充值系统繁忙”轻松应对
2019-02-06 11:03 3905大过年的,联通充个值一直报“充值系统繁忙”。昨天晚上试了几 ... -
electron.js数据库应用---导航菜单(element-ui+mysql)
2019-02-05 21:33 2296一、环境搭建 略, ... -
electron.js数据库应用---入门(mysql+element-ui)
2019-01-27 23:19 7305我的机器:Windows10,64 ... -
SpringMVC 在controller层中注入成员变量request,是否线程安全
2018-12-17 21:17 2691@RestController public class ... -
VueJS 组件参数名命名与组件属性转化
2018-12-03 00:00 2005转自:https://www.cnblogs.com/meiy ... -
vue-resource拦截器实现token发送及检验自动化
2018-11-16 22:38 3041用了很长时间vue-resource,最近思考$http发 ... -
element-ui试用手记
2018-10-29 20:25 1684element-ui、iviewui都以vue.js为基础 ... -
iviewui中表格控件中render的使用示例
2018-07-07 16:46 9713示例了如何在表格中显示按钮,如何将代码转化为文字。 i ... -
Tomcat错误“Alias name tomcat does not identify a key entry”解决
2018-07-05 21:39 6179申请到了阿里云的证书后,下载、按照说明生成jks格式证书、 ... -
阿里云免费证书“fileauth.txt内容配置错误”解决
2018-07-05 20:43 5196最近研究微信小程序开发,上阿里云申请了个证书,使用文件验证 ... -
springboot2.0跨域配置
2018-07-04 22:11 5235springboot2.0跨域配置: 一、代码 ... -
微信小程序使用code换openid的方法(JAVA、SpringBoot)
2018-07-01 21:52 10293微信小程序序的代码中提示,使用code换取openid,但 ...
相关推荐
本文主要介绍了javascript函数重载解决方案,利用JavaScript中的特殊对象arguments来模拟函数重载。用它来判断传入参数的个数或类型以区分重载
说支持,是因为JavaScript函数对参数列表不作任何限制,可以在函数内部模拟对函数重载的支持。 实际上,在很多著名的开源库当中,我们都可以看到函数内部模拟重载支持的设计。例如说jQuery的jQuery.extend方法,就是...
我们来简单用两种方式来”模拟”下重载函数。 2.根据参数的个数来判断 javascript的函数中有一个叫arguments的变量,是记录参数的一个数组,我们可以用这个来判断参数的个数,然后分别执行不同的内容,就是同一个...
本文主要介绍了利用JavaScript中的特殊对象arguments来模拟函数重载的解决方案,非常的实用,给需要的小伙伴参考下
JavaScript 中的函数重载为 3.9KB,压缩为 1.4KB。 提供工具来模拟大多数严格类型语言中存在的。 防止难以阅读和维护的混乱、冗长、if 语句、类型检查函数。 受和启发的样式和 API。 npm install overload-js ...
大家都习惯了重载带来的便利。JavaScript有没有重载呢?有人会回答没有,因为函数会被覆盖;有人说有,我们可以模拟重载这 一操作。
而javascript没有方法重载这个概念。但是我们可以通过arguments这个参数来伪装成函数的重载 在模拟之前我们先看一下代码: 代码如下: //表面上没有声明形式参数的函数 function fun() { alert(“示例代码”&#...
6.2.2.3 一个使用Arguments对象模拟函数重载的例子 6.2.3 参数类型匹配--一个利用arguments实现函数重载机制的例子 6.3 函数的调用者和所有者 6.3.1 函数的调用者 6.3.2 函数的所有者--一个为函数...
6.3.3 模拟堆栈和队列操作的方法 6.3.4 使用splice()方法添加和删除数组元素 6.3.5 修改length属性更改数组 6.3.6 调用Array对象的方法生成字符串 6.3.7 连接两个数组 6.3.8 常见属性和方法汇总 6.4 Date对象 6.4.1 ...
假如 我这样定义: 代码如下: function getDate(){... 那么JavaScript是怎么实现(准确地讲应该叫“模拟”)的呢?。 答案很简单:arguments arguments是JavaScript里的一个内置对象,包含了调用者传递的实际参数,但不
模拟函数重载 10 (3) Function对象(类) 10 Function对象的使用 10 使用Function类的length属性 11 使用Function类的valueOf()方法和toString()方法 11 (4) 闭包 11 8. 循环语句 11 (1) for循环 12 ...
6.3.3 模拟堆栈和队列操作的方法 6.3.4 使用splice()方法添加和删除数组元素 6.3.5 修改length属性更改数组 6.3.6 调用Array对象的方法生成字符串 6.3.7 连接两个数组 6.3.8 常见属性和方法汇总 6.4 Date对象 6.4.1 ...
Javascript已经可以模拟出面向对象的封装和继承特性,但是不幸的是Javascript对多态特性的支持非常弱!其它面向对象语言的多态一般都由方法重载和虚方法来实现多态,Javascript也通过这两种途径来实现! 重载:由于...
但可用arguments对象模拟重载效果。 arguments对象:函数对象内,自动创建的专门接收所有参数值得类数组对象。 arguments[i]: 获得传入的下标为i的参数值 arguments.length: 获得传入的参数个数! 重载: 程序...
2.11.1 无重载..............................................53 2.11.2 arguments 对象..............................................53 2.11.3 Function 类..............................................54 ...
由使用,用于在Unity3d上构建严肃的游戏和模拟。 如果您对使用诺言进行游戏开发和Unity感兴趣,请参阅。最近更新v3.0(2018年2月15日) 最后经过修改,使其工作方式与JavaScript中的一致。 增加了对在诺言中报告...
+为TabStrip的GetAddTabReference函数增加重载方法,以便指定Tab的图标(feedback:mmdcup)。 -修正此函数通过PageContext.RegisterStartupScript调用时不能正确显示Icon的BUG(feedback:zhaowenke)。 -修正basic/...
贾斯克 与集成的依赖注入器。 Jasq 通过重载 Jasmine 的describe和it来... 为了实现依赖注入,Jasq 包装了 Jasmine 的describe & it全局函数,并额外提供了重载版本,它们接受的参数不同。 这些作为 Jasmine 内置功能的
+为TabStrip的GetAddTabReference函数增加重载方法,以便指定Tab的图标(feedback:mmdcup)。 -修正此函数通过PageContext.RegisterStartupScript调用时不能正确显示Icon的BUG(feedback:zhaowenke)。 -修正basic/...