Задача: Лаконично (используя деструктуризацию), "разбить" передаваемый в функцию-конструктор объект на переменные свойства для новых экземпляров.
Иными словами, почему нижеприведенный пример кода неправильный?
class Menu {
constructor(options = {}) {
{
title: this.title = 'Empty'
} = options; // (*)
}
}
const menu = new Menu();
К примеру, если бы строка (*) была такой: let {title: t = 'Empty'} = options;, то ошибки не будет, однако, это не избавить от писанины длинной вереницы присваиваний, наподобие: this.title = options.title || 'Empty' //...
Ответ
Проблема была в том, что в инструкции: {title: this.title = 'Empty'} = options; интерпретатор левую часть воспринимает, как блок инструкций, и соответсвенно не может произвести операцию присваивания.
Наверное, это тонкий момент, но в основном потоке кода, деструктуризация должна являться частью выражения, например, let {title: t = 'Empty'} = options;
В том случае, если переменные уже объявлены выше, или как в этом случае, идёт обращение к свойствам объекта, можно попробовать так:
function Menu(options = {}) {
({title: this.title = 'Empty'} = options); // (*)
}
const menu = new Menu();
Теперь строка (*) заключена в круглые скобки, а фигурные интерпретируются так, как и было задумано.
Комментариев нет:
Отправить комментарий