По крайней мере, на данный момент классы ES 6 не являются лучшими друзьями элементов Marionette: Application, View или CollectionView. Но, к счастью, есть несколько умных обходных путей, в том числе один, который довольно прост в использовании.
ЭС 6 классы
Это одна из самых ожидаемых функций на протяжении многих лет (особенно людьми, пришедшими из мира Java/C#), и в то же время одна из самых ненавидимых разработчиками старой школы JS: Синтаксис класса JavaScript . И тут следует помнить две самые важные, на мой взгляд, вещи о классах ES 6:
- Это лишь синтаксический сахар вокруг известного Prototype, поэтому, с одной стороны, не исключено, что в некоторых ситуациях это может сбить с толку новичков в Java/c#, а с другой стороны — такие ситуации должны быть достаточно редкими, и это затрудняет миграцию с Прототипировать синтаксис класса проще.
- В классе все идет в строгом режиме.
Я думаю, что синтаксис класса делает код более чистым и легким для чтения.
Неожиданные проблемы
К сожалению, это плохо работает с Backbone и Marionette:
Backbone полагается на добавление свойств к прототипу класса перед вызовом конструктора класса 1. Классы ES6 не предоставляют никакого способа определить свойства прототипа как часть определения класса.
Вы можете прочитать больше здесь: Почему классы Backbone.js и ES6 не смешиваются.
Решения
К счастью, в том же блоге я нашел пост с решениями: Пересмотр классов Backbone и ES6.
Относитесь ко всему как к методу
Одно из решений мне особенно помогло (тот же пост):
Backbone оценивает все свои свойства с помощью функции Underscore
_.result
._.result
проверяет, является ли свойство объекта функцией. Если да, то_.result
оценит его и вернет результат. Это позволяет Backbone принимать свои свойства либо как объект, либо как функцию. Очень кстати. Таким образом, одним из способов решения проблемы с конструктором является превращение всего в метод, включая свойства.
На мой взгляд, это требует от меня как можно меньше изменений, мне не нужно добавлять какие-то лишние методы.
Пример
В качестве доказательства концепции я переписал несколько классов из Backbone’s extend
в нативный ES Class, например — Application class (app.js
):
class Application extends Mn.Application { channelName () { return "chessboardMoves"; } radioEvents () { return { "move": "onMove" }; } onMove (move) { alert(`Move: ${JSON.stringify(move)}`); } }
Единственное существенное изменение заключается в том, что channelName
, ранее связанный как строка, становится методом, возвращающим строку.
Вывод
Я не ожидал этой проблемы с довольно простой функцией ES 6, и я хотел бы поблагодарить Бена Маккормика за предоставление умных решений.
‹‹ Читать мой предыдущий пост: