Страницы

Поиск по вопросам

четверг, 20 июня 2019 г.

Деструктурирование объекта. Ликбез

Задача: Лаконично (используя деструктуризацию), "разбить" передаваемый в функцию-конструктор объект на переменные свойства для новых экземпляров. Иными словами, почему нижеприведенный пример кода неправильный?
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();
Теперь строка (*) заключена в круглые скобки, а фигурные интерпретируются так, как и было задумано.

Комментариев нет:

Отправить комментарий