命名为默认ES6参数,不进行破坏

时间:2017-01-29 12:52:31

标签: javascript ecmascript-6 babeljs ecmascript-7

我尝试使用babel在ES7中默认选项。这是我能做的:

class Foo {
  constructor({key='value', foo='bar', answer=42}) {
    this.key = key; 
    this.foo = foo;
    this.number = number;
  }
}

这可能适用于此示例,但我想知道如何为非常大的配置对象分配; 这里是我想做的一个例子:

class Foo {
  constructor(opts = {key='value', foo='bar', answer=42}) {
    this.opts = opts;
  }
}

但是这不能编译。我试着这样做:

class Foo {
  constructor(opts = {key:'value', foo:'bar', answer:42}) {
    this.opts = opts;
  }
}

然后它取代整个对象,如下:

let foo = new Foo({key: 'foobar'});

console.log(foo.opts);
// {key: 'foobar'} is what is displayed
// When I want {key: 'foobar', foo:'bar', answer:42}

2 个答案:

答案 0 :(得分:2)

class Foo {
  constructor({key='value', foo='bar', answer=42} = {}) {
    ...
  }
}

这是ES6解构功能,并非特定于ECMAScript 7(ECMAScript Next)提案。

如果没有解构,通常会使用对象克隆/合并,Object.assign来帮助:

class Foo {
  constructor(opts = {}) {
    this.opts = Object.assign({
      key: 'value',
      foo: 'bar',
      answer: 42
    }, opts);
  }
}

答案 1 :(得分:2)

我不认为你可以使用ES6可选参数(对象作为带有可选键的参数)来执行此操作,因为当您调用构造函数时,它是一个带有新引用的新对象。那是因为它被替换了。

但是,作为一个建议,如果你想处理一个大的选项对象,一种常见的方法是存储一个默认选项对象,并将该对象与实例化时传递的对象合并。 / p>

类似的东西:

class Foo {

  constructor(opts) {
    this.opts = Object.assign({}, Foo.defaultOptions, opts)
    console.log(this.opts)
  }
}

Foo.defaultOptions = {
    key: 'value', 
    foo: 'bar',
    answer: 42
}

let foo = new Foo({key: 'another value'})
//{ key: 'another value', foo: 'bar', answer: 42 }

您可以与Object.assign合并(请注意,它不会执行深度合并 - 替换嵌套对象)。

或者,如果您要将默认选项Object声明为类变量(不是在结尾,在类声明之后或在构造函数内),因为您正在使用babel,您可以使用this插件并执行此操作:

class Foo {

    defaultOptions = {
        key: 'value', 
        foo: 'bar',
        answer: 42
    }

    constructor(opts) {
        this.opts = Object.assign({}, this.defaultOptions, opts)
        console.log(this.opts)
    }
}

它更具可读性。