网络编程
位置:首页>> 网络编程>> JavaScript>> JS中模拟函数重载

JS中模拟函数重载

作者:LuLi 来源:SimpleLife 发布时间:2008-01-03 16:46:00 

标签:javascript,函数重载,函数

在面向对象的编程中,很多语言都支持函数重载,能根据函数传递的不同个数、类型的参数来做不同的操作,JS对它却不支持,需要我们额外做些小动作。

在JS的函数执行上下文中有一个名为arguments的有意思的变量,它以数组的形式存储了函数执行时传递过来的所有参数,即使函数定义没有定义这么多个形参。还有一个特别之处就是跟Array类型相比,arguments变量有且只有一个length属性,Array的方法,例如push、pop等,它并不具备,它只是一个“伪数组”:具有length属性,存储的数组能够用数组访问符[]来访问,并且是只读不可写。

一、对于不同个数参数的重载
  这里应该很明白,直接用arguments函数的length属性来判断就可以了。


var len = arguments.length;
        //传递过来一个参数的时候执行 
        if(len==1){
            alert("Function say:"+msg);
        }
        //传递过来两个参数的时候执行
        else if(len==2){
            handler(msg);
        }
    }
    talk("demo");
    talk("demo",function(w){alert("Handler say:"+w);}); 


二、对于不同类型的参数的重载

对于JS这样一种动态类型的语言,这种变量声明的随意性淡化了严格的变量类型在开发人员脑子里的重要性(PS:同样是基于ECMA体系的,AS就引入了变量声明的强制类型),很多意想不到的BUG其实都是由这种变量类型的自动转换造成的。其实JS提供了很准确的方法让我们来严格检测变量的类型,比较通用的就是typeof方法和constructor属性。
  1、typeof variable 返回变量类型


temp = "say";       //string
    temp = 1;           //number
    temp = undefined;   //undefined
    temp = null;        //object
    temp = {};          //object  
    temp = [];          //object  
    temp = true;        //boolean
    temp = function (){} //function
    
    alert(typeof temp); 


通过上面的测试你可以看出来,对于null,Object,Array返回的都是object类型,而使用下面的方法就可以解决这个困扰。

2.constructor属性检测变量类型

JS中每个对象都有constructor属性,它是用来引用构造此对象的函数,通过对这个引用的判断就可以检测变量类型了。


temp = "say";         
    temp.constructor==String; //true
 
    temp= {};
    temp.constructor == Object;//true
 
 
    temp= [];
    temp.constructor == Array;//true 


通过上面的测试已经很容易的把Array和Object类型的变量区分开了。下面我们来对自定义的对象做个测试看看会发生什么。


//自定义对象
    function Ball(){}
    //实例化一个对象
    var basketBall = new Ball();
    basketBall.constructor==Ball; //true 


这可以说明constructor属性对于自定义的对象一样适用。

在弄清楚了上面两个方法的适用以后再来回到JS函数重载的模拟上来,下面这个例子是根据参数类型来重载。


function talk(msg){
        var t = typeof msg;
        if(t=="string"){
            alert("It's a string");
        }
        else if(t=="number"){
            alert("It's a number");
        }
    }
 
    talk(10);       //It's a string
    talk("demo");   //It's a number 


附上一个很巧妙的严格检测参数类型和个数的函数:

//依据参数列表来严格地检查一个变量列表的类型
    function strict( types, args ) {
        //确保参数的数目和类型核匹配
        if ( types.length != args.length ) {
            //如果长度不匹配,则抛出异常
            throw "Invalid number of arguments. Expected " + types.length +
                ", received " + args.length + " instead.";
            }
        //遍历每一个参数,检查基类型
        for ( var i = 0; i < args.length; i++ ) {
            //如JavaScript某一项类型不匹配,则抛出异常
            if ( args[i].constructor != types[i] ) {
                throw "Invalid argument type. Expected " + 
                    types[i].name +", received " + 
                    args[i].constructor.name + " instead.";
            }
        }
    }
    
    //上述方法的使用
    function doFunction(id,name){
        //检测参数个数和类型
        strict([Number,String],arguments);
        ..
    }


0
投稿

猜你喜欢

  • 但是有时候,可以视看处进逻辑程度,可以把三者写成一个触发器,只是在其中稍作判断而已。 你可以根据从下面方法判断触发器是是处理了插入,删除还是
  • 1、问题现象:有个网站是通过session验证的,前端时间访问正常,但近期后台session老是失效很快,根本没法操作,我设置timeout
  • MySQL 一级防范检查列表以下是加固你的 Mysql 服务器安全所要做的工作的重要参考:Securing MySQL: step-by-s
  • 提要:系统自带的mysql默认字符集不是gbk,因此给数据库的推广应用以及中文程序的开发带来极大的不便,在没完没了的GBK和UTF8的转换过
  • 有在论坛上看到一帖,《请教查询出连续日期记录的方法》,截图如下:Insus.NET尝试写了程序并做了测试,可以得到预期的结果,SQL代码可参
  • 如何在ASP.NET中使用ADO.NET连接数据库?以连接Access数据库为例,步骤如下:一、我们来用有源ODBC DSN的方法和无源OL
  • 通常我们会在一些javascript的书籍上看到,使用Javascript保留字作为标识符(变量名、函数名、循环标记等)时,会引起程序报错!
  • 又是一年春来到,看各大网站的新年Logo也成为了我们必不可少的新年餐点,为此,我们特别整理了部分网站的新年Logo秀,如果你看到了更加有意思
  • Javascript 选择器(selector engine)似乎从 jQuery 流行以来就大行其道,改变了原有 Javascript 选
  • 下面的代码是从kesion系统扒下的,确实不错,支持utf8格式。代码如下:'===========================
  • 一、在访客的内心深处做导航我讨厌迷失,不管是在道路上或是在线网络上。猜想一下?您的访客也是这样的。就像我们期望看到的道路上的路标一样,来帮助
  • 如何利用网页弹出各种形式的窗口,我想大家大多都是知道些的,但那种多种多样的弹出式窗口是怎么搞出来的,我们今天就来学习一下:推荐:网页弹出窗口
  • 模式库 在模式库里,我将列出所有电子商务网站需要的模式.以下将罗列出经典常用的模式案例,我也试图让这些模式看起来更有趣味性与实用性。(Yah
  • 网上有很多关于PHP在IIS下配置的教程,但都是一些很理性化的东西,我从里面整理出来这个教程 发出来为了方便参考,有什么问题也可以大家一起交
  • 最近决定把MT的后台数据从Berkeley的文件DB转到MySQL。原因之一是使用关系数据库可以获得更多的灵活性,比如运行一条sql来变更
  • 在经过前面几个部分的操作之后,我们的网页已经图文并茂,具有相当的效果了,但是这对于网页来说还不够,为了网站中的众多网页能够成为一个有机的整体
  • 在给blog加上无刷新搜索和即时验证检测后,又看了下代码,感觉太过麻烦,就把XMLHttpRequest请求封装到一个类里面,用起来方便多了
  • 一个不错的js星级评分代码,可以评多个指标。相关文章推荐:用css制作星级投票评分功能 效果图:<script language=&q
  • 测试sql: 代码如下:SET STATISTICS IO ON SET STATISTICS TIME ON SELECT COUNT(1
  • Set objTextStream=FileSystemObject.CreateTextFile(Filename,[Overwrite]
手机版 网络编程 asp之家 www.aspxhome.com