ES6: Расширение литерала объектов
Краткие свойства объектов
Для того чтобы записать переменную в свойство объекта раньше приходилось придерживаться не самой приятной формы записи:
Теперь нет необходимости записывать всё по два раза. Присваивание свойств выглядит следующим образом:
Краткие методы объектов
Краткая форма записи методов реализована схожим образом.
Было:
Стало:
Когда вы используете ES6 вариант методов a() { /* function body */ }
, то подразумеваете: “Создай метод a
, который будет содержать в себе анонимную функцию”:
На первый взгляд, присваивание имени функции, записываемой в свойство объекта, может показаться таким же бесполезным занятием, как и { a: a }
в предыдущем примере. Это не так. Рассмотрим небольшой пример с рекурсией, чтобы понять, в чём заключается разница:
При записи анонимной функции в метод factorial
единственный способ обратиться к функции — вызвать соответствующий метод объекта math
. Хорошая ли это идея? Возможно, но, скорее всего, нет. Подобная запись предполагает, что math
всегда будет указывать на один и тот же объект, что очень часто может оказаться неправильным выводом. Самый простой способ решить подобную проблему — использовать this
:
Но и в данном случае нельзя получить желаемого результата во всех случаях. Например, при передаче callback функций:
Естественно решить подобную проблему можно с помощью метода функций bind
или замыкания (подробнее о способах передачи аргументов в callback функции можно узнать в этой статье):
В чём, на самом деле, заключается разница между именованной функцией и анонимной:
Теперь к функции factorial
можно обращаться без лишних “посредников”. Разумеется, функция останется недоступная в более высоких областях видимости:
Таким образом, подобная запись даёт возможность обращаться к функциям без использования их объекта-обвёртки. И именно такое поведение не реализовано в кратких методах объектов:
Данный способ создания методов короче, но может принести с собой ряд проблем. Использовать его стоит только в тех случаях, когда вы точно уверены, что вы никогда не будете использовать рекурсию или передавать функцию в обработчики событий.
Установка прототипов
Иногда бывает очень полезно установить прототип для объекта прямо во время его создания. Ранее была возможность установить прототип с помощью свойства __proto__
. Она не была стандартизирована, но поддерживалась многими движками:
С релизом ES6 установить прототип объекта теперь можно согласно стандарту. Для этого используется функция Object.setPrototypeOf
, которая принимает два объекта. Первому переданному объекту будет присвоен второй в качестве прототипа:
Подробнее о функции Object.setPrototypeOf
можно узнать на MDN.
Super
Обычно super
ассоциируется с классами. Тем не менее, так как JavaScript имеет прототипное наследование, то есть понятие класс приравнивается к “объект с прототипом”, super
отлично работает и с краткими методами обычных объектов:
Важно: super
может быть использован исключительно с краткими методами. С обычными функциями работать он не будет. Также разрешено его использование только в форме super.method
, чтобы получить доступ к методам и свойствам. Исполььзовать в форме super()
при работе с обычными объектами нельзя.
Комментарии