函数调用时可以使用解构吗?

时间:2018-10-09 12:53:22

标签: javascript ecmascript-6

我想在这样的构造函数调用中使用解构:

signup: async (userInfo) => {
    const user = new User({ email, password, privacyPolicyConsent, username } = userInfo);
}

但是参数是不确定的。

我想通过重新声明防止注入不需要的参数,因此我不想像这样传递整个对象:

signup: async (userInfo) => {
    const user = new User(userInfo);
}

目前,我的解决方法如下:

signup: async (userInfo) => {
    const { email, password, privacyPolicyConsent, username } = userInfo;
    const user = new User({ email, password, privacyPolicyConsent, username });
}

但是我觉得我可以用更好的方式写这部分。我错过了什么?任何有关最佳做法的建议都值得赞赏。

2 个答案:

答案 0 :(得分:4)

您可以像下面这样直接销毁它

signup: async ({ email, password, privacyPolicyConsent, username }) => {
    const user = new User(email,password,privacyPolicyConsent,userName);
}
signUp(userInfo);

更新

这将防止在未定义的情况下发送销毁错误 因此,在发送前,您需要检查userInfo

if(userInfo) signUp(userInfo);

更新2

如果您不想检查userInfo是否未定义 您可以在方法级别分配默认值,如下所示:

signup: async ({ email, password, privacyPolicyConsent, username }={}) => {
        const user = new User(email,password,privacyPolicyConsent,userName);
    }

答案 1 :(得分:0)

哦,我也会。

这就是我倾向于做的(立即调用的函数):

signup: async userInfo => {
  const user = new User((({ email, password, privacyPolicyConsent, username }) =>
    ({ email, password, privacyPolicyConsent, username })
  ))(userInfo));
}

将其简化为一条语句,但不能解决重复(丑陋)代码的问题。


也许执行此操作的功能可能是最佳做法:

const dstr = (obj, ...keys) => keys.reduce((o, k) => { o[k] = obj[k]; return o; }, {});

// ...

const user = dstr(userInfo, email, password, privacyPolicyConsent, username);

或者您可以使用那种reduce方法来内联创建它:)

好奇有什么替代品。

(编辑)以上假设您无法预先破坏对象。