2017-01-29 8 views
0

Я пытаюсь использовать параметры по умолчанию в ES7 с помощью babel. Вот то, что я могу сделать:Именованный параметр ES6 по умолчанию без деструктурирования

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

Я не думаю, что вы можете сделать это с помощью ES6 дополнительных параметров (объект в качестве параметра с дополнительными клавишами) , потому что когда вы вызываете конструктор, это новый объект с новой ссылкой. Это потому, что его заменяют.

Но, если вы хотите обработать объект больших опций, один общий подход хранится где-то параметры по умолчанию Объект и объединить объект с переданным при его экземпляре.

Нечто подобное:

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) 
    } 
} 

Это более читаемо.

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); 
    } 
} 
+0

Извините, я понял, что мой пост не совсем ясен. Поэтому я редактировал название. Я не хочу разрушать свой параметр – Vinz243

+0

Без деструкции вам нужно скопировать объекты вручную. Я обновил ответ с рецептом, который я обычно использую для этого. – estus

+0

Вот что я в итоге сделал, чтобы в конце концов я просто хотел узнать, смогу ли я сделать это с ES6/7. Благодаря! – Vinz243

Смежные вопросы