让我假装我有一个我希望能够以两种方式使用的功能:
movePoint("pointName", 32, 25)
或者
movePoint({
name: "pointName",
x: 32,
y: 25,
otherRarelyUsedParameter: true,
})
在过去,我只会检查第一个参数是否为字符串,如果是,对待它好像用户输入了第一种格式;如果没有,我会假设它是一个对象并直接使用它。
我们能否使用任何es6魔法来实现这种行为。如果我为第一个案例编码:
function movePoint (name, x, y)
对于第二种情况,我会使用:
function movePoint ({name, x, y, otherRarelyUsedParameter=true})
是否可以保留第二种语法,同时也允许第一个参数为字符串。
如果答案是否定的,您是否对实施此方法最可读的方法有任何建议?
答案 0 :(得分:3)
我认为你真的不应该像这样使用重载。但是当你这样做时,编写第二个函数可能是最简单的解决方案:
function movePoint (o, x, y) {
if (typeof o == "string")
return _movePoint({name: o, x, y});
else
return _movePoint(o);
}
function _movePoint ({name, x, y, otherRarelyUsedParameter=true}) {
…
}
答案 1 :(得分:1)
这里有两条逻辑,检测输入类型的逻辑和移动点的逻辑。最好用两个函数来处理:
function movePoint(nameOrSpec, x, y) {
if (typeof nameOrSpec === "string") {
return movePointInternal({
name: nameOrSpec,
x,
y
});
} else {
return movePointInternal(nameOrSpec);
}
}
function movePointInternal({ name, x, y }) {
// Do whatever the function needs to do
}
使用一个函数和解构可以做到这一点,但在我看来它不是首选的选项:
function movePoint({ name = arguments[0], x = arguments[1], y = arguments[2] }) {
// Do function work with (name, x, y)
console.log({ name, x, y });
}