Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript中进行重载?_Javascript_Overloading - Fatal编程技术网

如何在javascript中进行重载?

如何在javascript中进行重载?,javascript,overloading,Javascript,Overloading,我正在努力学习javascript中的重载。我在谷歌上搜索了一下,有一种方法可以使用参数长度,然后添加开关条件。但我对那样做不感兴趣。事实上,我当时看到了一个很好的答案 但他没有用自己的观点给出任何超载的例子。那么,如何在javascript中实现重载呢 这是我的密码。我需要使用上述解决方案重载一个方法。他说这样做: 我将如何在代码中实现这一点 function foo(a, b, opts) { } function foo(a) { console.log("one argume

我正在努力学习javascript中的重载。我在谷歌上搜索了一下,有一种方法可以使用
参数
长度,然后添加开关条件。但我对那样做不感兴趣。事实上,我当时看到了一个很好的答案
但他没有用自己的观点给出任何超载的例子。那么,如何在javascript中实现重载呢

这是我的密码。我需要使用上述解决方案重载一个方法。他说这样做:

我将如何在代码中实现这一点

function foo(a, b, opts) {

}

function foo(a) {
    console.log("one argument pass");
}

function foo(a, b) {
    console.log("two argument pass");
}

function foo(a, b, c) {
    console.log("three argument pass");
}


foo(1);
foo(1,2);
foo(1,2,3);
写在这里 使用参数进行函数重载的最佳方法不是检查参数长度或类型;检查类型只会让你的代码变慢,你可以享受数组、空值、对象等的乐趣。
大多数开发人员所做的是将对象作为其方法的最后一个参数。此对象可以保存任何内容。

调用函数时,JavaScript不需要传递所有参数,因此可以像这样实现重载:

function foo(a, b, c) {
    if (c === undefined) {
        if (b === undefined) {
            if (a === undefined) console.log("zero argument pass");
            else console.log("one argument pass");
        }
        else console.log('two argument pass');
    }
    else console.log('three argument pass');
}
检查算术

function foo(a, b, opts) {
    if (arguments.length === 1) {
        console.log("one argument pass")
    } else if (arguments.length === 2) {
        console.log("two argument pass")
    } else if (arguments.length === 3) {
        console.log("three argument pass")
    }
}

foo(1); // "one argument pass"
foo(1,2); // "two argument pass"
foo(1,2,3); // "three argument pass"
来自

var namespace={};
函数addMethod(对象、名称、fn){
var old=对象[名称];
对象[名称]=函数(){
if(fn.length==arguments.length){
返回fn.apply(这是参数);
}else if(typeof old==='function'){
返回old.apply(这个,参数);
}
};
}
addMethod(名称空间,“foo”,函数(a){
编写(“一个参数通过
”); }); addMethod(名称空间,“foo”,函数(a,b){ document.write(“两个参数通过
”); }); addMethod(名称空间,“foo”,函数(a,b,c){ 编写(“三个参数通过
”); }); foo(1); foo(1,2);
foo(1,2,3)
JS不支持重载,所以我不确定您希望第二个代码段如何工作。每次重新声明
foo
之前的声明都会丢失。您能解释一下为什么不想检查
参数的长度吗?询问如何做某事,但任意限制其中一种方式,似乎有点奇怪。换一种说法,是什么让你的问题与你链接的问题不同?@user944513我没有提出任何答案。我建议把这个问题作为一个重复的问题来结束,因为它不会问上一个问题中没有问过的任何问题。如果觉得该问题的答案没有提供足够的信息,则不足以打开一个新问题。这肯定是重复的,因为user944513不断引用先前发布的问题,要求“该解决方案”。@user944513如果您的方法根据参数的数量做完全不同的事情,也许制作3种不同的功能会更好?如果您的方法对每一个都几乎相同,为什么不将其参数长度抽象化呢?如果您只想设置默认值,只需使用一个方法并设置默认值!这个解决方案是什么我需要使用这个解决方案为什么要克隆
参数
对象?同时检查@user944513,你会一直链接到一个问题,并说你需要使用这个“解决方案”。你说的是什么解决方案?@user944513是一个链接,指向一个有20多个不同答案的问题,而不是一个“解决方案”。@user944513是一种避免任何函数重载的方法。将任何可选参数替换为一个参数,该参数应通过
{}
传递。在
{}
中查找所有可选参数。
function foo(a, b, opts) {
    if (arguments.length === 1) {
        console.log("one argument pass")
    } else if (arguments.length === 2) {
        console.log("two argument pass")
    } else if (arguments.length === 3) {
        console.log("three argument pass")
    }
}

foo(1); // "one argument pass"
foo(1,2); // "two argument pass"
foo(1,2,3); // "three argument pass"
var namespace = {};

function addMethod(object, name, fn) {
    var old = object[name];
    object[name] = function() {
        if (fn.length === arguments.length) {
            return fn.apply(this, arguments);
        } else if (typeof old === 'function') {
            return old.apply(this, arguments);
        }
    };
}

addMethod(namespace, "foo", function (a) {
    console.log("one argument pass");
});

addMethod(namespace, "foo", function (a, b) {
    console.log("two arguments pass");
});

addMethod(namespace, "foo", function (a, b, c) {
    console.log("three argument pass");
});

namespace.foo(1);
namespace.foo(1, 2);
namespace.foo(1, 2, 3);