我尝试使用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}
答案 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)
}
}
它更具可读性。