现在的位置: 首页 > 综合 > 正文

JS实现函数重载

2013年05月09日 ⁄ 综合 ⁄ 共 4338字 ⁄ 字号 评论关闭

不想写太多的方法名,网上百度的:

JavaScript 语言的方法声明中,不能明确指定参数的类型和个数,所以不能实现方法的重载,但是我们可以用其他的方法来实现重载的效果。

在 JavaScript 的方法内,有个叫做 arguments 的变量数组,它是只读的,所有实际传入的参数变量都
放在了里面,通过它,我们可以对传入的参数进行类型检查,从而实现重载的效果。

判断一个变量的类型有两种方法

用 typeof 语句:
function check(){
if(typeof arguments[0] == 'string')
alert('你传入的参数是个字符串');
else if(typeof arguments[0] == 'number')
alert('你传入的参数是个数字');
}

用所有 JavaScript 变量都带有的一个属性 constructor,这个属性指向用来构造该变量的构造函数:
function check(){
if(arguments[0].constructor == String)
alert('你传入的参数是个字符串');
else if(arguments[0].constructor == Number)
alert('你传入的参数是个数字');
}

对照表:

typeof constructor ---------------------------

string String

number Number

object Object

function Function

boolean Boolean

object Array

object User

 

一个新的函数重载模式。代码如下

var FunctionH = {
            map: function (arr, callback, pThis) {
                var len = arr.length;
                var rlt = new Array(len);
                for (var i = 0; i < len; i++) {
                    if (i in arr)
                        rlt[i] = callback.call(pThis, arr[i], i, arr);
                }
                return rlt;
            },
            overload: function (dispatcher, func_maps) {
                if (!(dispatcher instanceof Function)) {
                    func_maps = dispatcher;
                    dispatcher = function (args) {
                        var ret = [];
                        return FunctionH.map(args, function (o) { return typeof o }).join();
                    }
                }
                return function () {
                    var key = dispatcher([].slice.apply(arguments));
                    for (var i in func_maps) {
                        var pattern = new RegExp("^" + i.replace("*", "[^,]*").replace("...", ".*") + "$");
                        if (pattern.test(key)) {
                            return func_maps[i].apply(this, arguments);
                        }
                    }
                }
            }
        }

应用:

TINY.page = function () {
            var isNull = function () {
                if (document.getElementById("txtPEnterprise_NO").value == "") {
                    return true;
                }
                else
                    return false;
            };
            return {
                 select: function () {
                    if (isNull()) {
                        top.Dialog.alert("请您输入追溯码!");
                        return false;
                    }
                    else {
                        return true;
                    }
                },
                confirm: FunctionH.overload({
                    'string': function () {
                        if (isNull()) {
                            top.Dialog.alert("请您输入追溯码!");
                            return false;
                        }
                        if (!confirm(arguments[0])) {
                            return false;
                        }
                        return true;
                    },

                    'string,object':function(){

                         // arguments[0];为字符串值

                        //  arguments[1];为object值

                   },
                    'object': function () {
                        if (isNull()) {
                            top.Dialog.alert("请您输入追溯码!");
                            return false;
                        }
                        var obj = arguments[0];
                        if (typeof obj == "object") {
                            var tooltip = obj.getAttribute("title")
                            if (tooltip == "lock") {
                                if (!confirm("您确定锁定该批次产品吗?")) {
                                    return false;
                                }
                                return true;
                            }
                            else if (tooltip == "unlock") {
                                if (!confirm("您确定解锁该批次产品吗?")) {
                                    return false;
                                }
                                return true;
                            }
                        }
                    }
                })
            }
        } ();

调用:

 <asp:Button ID="BtnLock" Enabled="false" runat="server" Text="锁 定" 
                     CssClass="blueButtonCss1" onclick="BtnLock_Click" ToolTip="lock"  OnClientClick="return TINY.page.confirm(this);"/> &nbsp; &nbsp;
 <asp:Button ID="BtnDestory" Enabled="false" ToolTip="destory" runat="server" 
                        Text="销 毁" CssClass="blueButtonCss1" onclick="BtnDestory_Click"  OnClientClick="return TINY.page.confirm('确定销毁?');"/>

 TINY.page.confirm('确定销毁?',this);

转载自:

http://www.cnblogs.com/bluedream2009/archive/2011/01/05/1925963.html

http://www.jb51.net/article/19579.htm

抱歉!评论已关闭.