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