Ниже представлен материал о конструкциях, которые мы сможем использовать, когда реализуем их где-то. Рад буду обсудить их плюсы, минусы, варианты применения (их ожидаемое поведение). И будут шансы увидеть эти конструкции в том или ином скриптовом инструменте или расширении. Поехали.
Сразу предупреждаю вас о необходимости отодвинуться от холодильника подальше и контролировать желание бросить в меня помидор, которое обязательно возникнет, если вы тратили часы, изучая ECMAScript и особенно, если вы не большой любитель JS.
Не повторяйте увиденное, не забивайте себе голову, если вы в данный момент не разрабатываете свой язык программирования!
Что снится программисту который заботится о краткости и аккуратности кода? Фантастические сниппеты!
Упрощенные выражения заключающие в себе самую суть действия, содержащие меньше лишних синтаксических конструкций насколько возможно и невозможно.
>>(1) Множественное определение свойств ранее созданным объектам.
Широкое применение находит определение множества свойств объекта конструкцией следующего вида:
var mapItemSketch = {
obj : nodes[i],
draggable : false
};
Что эквивалентно следующей последовательной записи:
var mapItemSketch = {};
mapItemSketch.obj = nodes[i];
mapItemSketch.draggable = false;
Однако невозможным на данный момент является сперва определение пустого объекта, и последующее множественное определение его свойств в одной "фигурной конструкции" вида:
var mapItemSketch;
mapItemSketch{obj : nodes[i], draggable : false};
***
>>(2) Циклическая функция
var m = for (let item of array, result=0 return result) result += item;
// m равен сумме элементов массива или 0 по умолчанию
В начале списка аргументов конструкции идет определение let или var, после всегда перебор перечисляемого объекта, такого как массив, после - объявление любых других переменных по умолчанию, в конце обязательно указание результирующей переменной которая пойдет в result.
Что эквивалентно рекурсивной функции и стрелочной рекурсивной функции.
***
>>(3) Вычисляемые сеттеры и геттеры случайных (то есть всех!) свойств.
В
ES6 у нас появился вычисляемый сеттер с геттером:
{get prop() { ... } }
{get [expression]() { ... } }
И это работает.
Но для вызова вычисляемого сеттера или геттера свойства, взаимодействие с которым мы описываем, это свойство должно быть обязательно определено. Что, если мы хотим создать универсальный сеттер и геттер для любого названия свойства, который будет представлять собой интерфейс для любого свойства объекта?
Тут пригодится "случайный сеттер" со "случайным геттером". Сеттеру и геттеру определим переменную _prop, содержащую ссылку на то свойство с которым мы взаимодействуем, задавая или получая его значение.
Необходимо отделить обращение к случайным сеттеру и геттеру от обращения к самим свойствам экземпляра класса или объекта. Для этого можно, например, применять специальную команду usingRandomProperties() и endUsingRandomProperties(), которая явно сообщает о начале действия области применения обращений к свойствам объекта как к сеттерам или геттерам с такими же названиями.
{get () { return this._prop } }
{set (value) { .this._prop = value } }
В момент когда выполнение кода попадает внутрь геттера или сеттера, обращение к "оборачиваемым" свойствам отключается и мы получаем запись самого свойства объекта, а не "обертку"-случайный геттер или случайный сеттер свойства объекта.
Это чем-то напоминает Прокси.
***
>>(4) Самовызываемый объект на примере "return object"
let c = (b) ? b : null;
if(c === null) return;
Сократим к виду:
let c = (b)? b: return;
А также
"var b = return;"
В этой ситуации произойдет присвоение переменной b функции и вызов ее исполнения, например специального самовыполняемого объекта-функции с действием return, которое произведет возврат не из самой себя, а из той функции, где объект был вызван и присвоен и код дошел до его исполнения.
***
>>(5) Однозначный условный оператор
let c = ( typeof b === "boolean" )? b;
В "противном случае" ветвления, переменная остается при своём значении, в данной ситуации при значении
undefined.
***