【问题标题】:Avoiding repetition in destructuring argument在解构论证中避免重复
【发布时间】:2016-01-11 01:39:08
【问题描述】:

我有一个函数ValidateInteger,它返回一个看起来像这样的对象:

{
    Value: "123",
    Neg: false,
    Exp: 3
}

我还有一个类调用这个函数:

class MyClass {
    constructor(val) {
        {
          Value: this.Value
          Neg: this.Neg
          Exp: this.Exp
        } = ValidateInteger(val);
    }
}

如您所见,this 有很多重复。

我的问题是有一些更好的语法来做到这一点,比如:

this.{Value, Neg, Exp} = ValidateInteger(val);

肯定应该有一些更好的语法。

【问题讨论】:

    标签: javascript ecmascript-6 destructuring


    【解决方案1】:

    我想你想要Object.assign。它可用于将可枚举属性的值从某些对象复制到另一个对象。

    Object.assign(this, ValidateInteger(val));
    

    var ValidateInteger = val => ({
      Value: "123",
      Neg: false,
      Exp: 3
    });
    class MyClass {
      constructor(val) {
        Object.assign(this, ValidateInteger(val));
      }
    }
    document.write('<pre>' + JSON.stringify(
      new MyClass() // MyClass { Value: "123", Neg: false, Exp: 3 }
    , null, 2) + '</pre>');

    【讨论】:

    • 问题是这会释放我并不总是想要的 all 变量。 This 的回答还建议避免使用 Object.assign 将对象释放到作用域。
    • @Downgoat Bergi 建议不要将随机属性分配给全局对象,我完全同意。这里我使用Object.assign 将属性分配给实例。
    • @Downgoat 我不知道“释放所有变量”是什么意思。它将从ValidateInteger 返回的对象中的所有属性分配给this。仅当从ValidateInteger 返回的对象包含您不想分配给this 的其他属性时,这将是一个问题;如果是这种情况,您只需将它们列出来。我也无法理解“将对象释放到范围”是什么意思。这个答案完全是关于另一件事的。它指的是为对象中的所有属性定义局部变量
    猜你喜欢
    • 2019-06-06
    • 1970-01-01
    • 2017-06-17
    • 2020-10-24
    • 1970-01-01
    • 2012-05-15
    • 2017-09-20
    • 2015-04-05
    • 1970-01-01
    相关资源
    最近更新 更多