js 实现重载
方法一:利用参数数量和类型判断实现重载
JavaScript本身不支持传统意义上的函数重载,但可以通过检查参数的数量或类型来模拟重载行为。
function example() {
if (arguments.length === 0) {
// 无参数情况
return "No arguments";
}
if (arguments.length === 1 && typeof arguments[0] === "string") {
// 单个字符串参数情况
return "String: " + arguments[0];
}
if (arguments.length === 2 && typeof arguments[0] === "number") {
// 两个数字参数情况
return arguments[0] + arguments[1];
}
// 其他情况
return "Default case";
}
方法二:使用对象参数实现灵活重载
通过接收一个配置对象作为参数,可以更灵活地处理不同参数组合。

function example(options) {
const defaults = {
name: "",
age: 0,
callback: function() {}
};
const settings = {...defaults, ...options};
if (settings.callback) {
settings.callback();
}
return `Name: ${settings.name}, Age: ${settings.age}`;
}
方法三:利用闭包实现方法链式重载
通过返回对象实现链式调用,每个方法可以看作是一个重载版本。

function Calculator() {
let result = 0;
return {
add: function() {
for (let i = 0; i < arguments.length; i++) {
result += arguments[i];
}
return this;
},
subtract: function() {
for (let i = 0; i < arguments.length; i++) {
result -= arguments[i];
}
return this;
},
value: function() {
return result;
}
};
}
const calc = new Calculator();
calc.add(1, 2).subtract(3).value(); // 0
方法四:使用ES6默认参数和剩余参数
ES6的语法特性可以更优雅地实现类似重载的效果。
function example(param1 = "default", ...rest) {
if (rest.length > 0) {
return `First: ${param1}, Rest: ${rest.join(", ")}`;
}
return `Single: ${param1}`;
}
方法五:策略模式实现重载
将不同参数情况的处理逻辑封装为策略对象。
const strategies = {
noArgs: function() {
return "No arguments";
},
singleString: function(arg) {
return "String: " + arg;
},
twoNumbers: function(arg1, arg2) {
return arg1 + arg2;
}
};
function example() {
const args = Array.from(arguments);
if (args.length === 0) {
return strategies.noArgs();
}
if (args.length === 1 && typeof args[0] === "string") {
return strategies.singleString(args[0]);
}
if (args.length === 2 && typeof args[0] === "number") {
return strategies.twoNumbers(args[0], args[1]);
}
return "Default case";
}
这些方法展示了在JavaScript中模拟函数重载的不同技术,每种方法适用于不同的场景和需求。






