Комментарии 33
Стоит добавить, что некоторые декораторы написанные для ES7/Babel не будут работать в typescript, из-за особенностей того как он транспилит свойства.
Например такие декораторы как noneunemerable из core-decorators работать не будут (и почти все декораторы кооторые применяются к полям).
Мне одному начинает казаться, что из JavaScript пытаются обратно сделать Java?
Но пока JS не прогибается! ;-)
Может и эта не пройдёт. ;-)
Вот, снизу постучали: «1. ES7 (aka ES2016) — уже принят как стандарт и в нем нету декораторов».
Так что — «Враг не пройдет!» (С)
;-)
Я вообще считаю, что последний JS это ES5. Всё что потом, это JS++. Очень уж его усложнили.
Особой сложности не заметил.
Новизна — это введение =>
И наконец-то визуально поправили написание класса. А то было просто смешно. ;-)
Лихо Вы сбросили со счетов IE11 и ниже.
Довольно популярные сайты могут себе позволить отправить пользователя ставить нормальный браузер, если он использует IE. Это логично, ведь потеря крайне малой доли пользователей приведёт к меньшему убытку, чем обеспечение поддержки IE.
Конечно, многое зависит от рынка, на который продукт ориентируется. Для лендингов и блогов, возможно, поддержа IE имеет смысл, в отличие от чего-то вроде твича.
Попытка такая уже была — внедрить ООП в JS — но не прошла.
Что это за попытка и почему не прошла?
В том js, который я знаю, ООП было с незапамятных времён, пусть и в немного необычном виде. В новом стандарте вообще ввели новый синтаксис для классов, так что теперь оно выглядит очень похоже на обычное ООП на классах, как в Java/C#/python/etc.
ES4 — Попытка встроить полноценное ООП в JS.
Почему не прошла? — Об этом написано много, но мало выводов — там просто так заспорили, что разругались все и НЕ договорились. И по быструхе выпустили ES5.
Такие вот страсти бушевали. ;-)
> В новом стандарте вообще ввели новый синтаксис для классов, так что теперь оно выглядит очень похоже на обычное ООП на классах, как в Java/C#/python/etc.
Ничего НЕ ввели в ES6.
Просто сейчас класс можно описать в одних(!) { }.
Раньше такого нельзя было.
Так что это сахар. Изменений нет. Всё осталось как в ES5.
Интерфейсы где? — НЕТУ. Это НЕ ООП. Это пародия. ;-)
Интерфейсы, как минимум, имеют смысл только при статической типизации. А статическая типизация основной профит имеет, когда язык компилируемый. Мне нравится, как в TypeScript все это сделали, там и интерфейсы, и статическая типизация, и компиляция, и классы можно объявлять в синтаксисе ES6 компилируя в ES5, или даже ES3.
Так что это сахар. Изменений нет. Всё осталось как в ES5.
Не совсем. Если использовать ES6 класс как функцию(без new
), то можно получить Error
, в котором говорят: "Аяяй! Не надо так!".
ES4 — Попытка встроить полноценное ООП в JS.
А какие критерии отличают полноценное от неполноценного? И чем нынешнее ООП не полноценно?
Почему не прошла?
Я нашёл обзор 4-й версии. Хорошо, что этот трэш не приняли.
Ничего НЕ ввели в ES6.
Так что это сахар.
Я вообще-то так и написал, смотрите: В новом стандарте вообще ввели новый синтаксис для классов, так что теперь оно выглядит очень похоже на обычное ООП на классах.
Всё осталось как в ES5.
Стандарт (касательно классов) описывает их синтаксис, и ещё некоторые аспекты поведения. Но я не нашёл там привязки к конкретной реализации. Чтобы новый синтаксис работал в старых движках, сейчас нужны транспайлеры, типа babel или ts. Но нативная поддержка синтаксиса в движках вполне может иметь другую реализацию.
Интерфейсы где? — НЕТУ. Это НЕ ООП. Это пародия. ;-)
Python, ruby, smalltalk… В этих языках тоже нет интерфейсов. Они тоже не ООП? А при желании, можно реализовать интерфейсы в этих языках, но зачем?
Ну, красивый язык был бы. Похожий на… остальные. ;-)
ООП — полное было бы реализовано.
Но… поругались там все, кто-то не успел реализовать что-то и… не пошёл ES4, вышел вскорости ES5.
Кстати, из
http://www.ecmascript.org/es4/spec/overview.pdf
Structural function types describe functions and methods. The type
function (int, string): boolean
describes a Function object that takes two arguments, one int and the other string, and which returns a
boolean
TypeScript подхватил, похоже эстафету этого ES4!!! ;-)
>В новом стандарте вообще ввели новый синтаксис для классов, так что теперь оно выглядит очень похоже на обычное ООП на классах.
Возможно. Но мне не похоже — нет интерфейсов. Я из мира Java. ;-)
>Стандарт (касательно классов) описывает их синтаксис, и ещё некоторые аспекты поведения. Но я не нашёл там привязки к конкретной реализации. Чтобы новый синтаксис работал в старых движках, сейчас нужны транспайлеры, типа babel или ts. Но нативная поддержка синтаксиса в движках вполне может иметь другую реализацию.
Внутренняя структура (его модель) объекта осталась неизменна.
>Python, ruby, smalltalk… В этих языках тоже нет интерфейсов. Они тоже не ООП? А при желании, можно реализовать интерфейсы в этих языках, но зачем?
Про эти языки ничего не скажу. Видел вот что некоторые и на чистом C (не С++) ООП реализовали то.
Но С как бы не считается языком с ООП.
(А по слухам, кто-то и на ассемблере реализацию ООП сделал).
В Javascrip реализаций ООП разных полно (ходила шутка, ты НЕ есть JS-программист, если ты свою реализацию ООП в JS не написал).
>А какие критерии отличают полноценное от неполноценного? И чем нынешнее ООП не полноценно?
«Объект в JavaScript — это просто коллекция пар ключ-значение (и иногда немного внутренней магии).
Однако, в JavaScript нет концепции класса. К примеру, объект с свойствами {name: Linda, age: 21} не является экземпляром какого-либо класса или класса Object. И Object, и Linda являются экземплярами самих себя. Они определяются непосредственно собственным поведением. Тут нет слоя мета-данных (т.е. классов), которые говорили бы этим объектам как нужно себя вести.
Вы можете спросить: «Да как так?», особенно если вы пришли из мира классических объектно-ориентированных языков (таких как Java или C#). «Но если каждый объект обладает собственным поведением (вместо того чтобы наследовать его от общего класса), то если у меня 100 объектов, то им соответствует 100 разных методов? Разве это не опасно? А как мне узнать, что, например, объект действительно является Array-ем?»
Чтобы ответить на все эти вопросы необходимо забыть о классическом ОО-подходе и начать всё с нуля.»
Однако, в JavaScript нет концепции класса.
В этом плане JavaScript похож на SmallTalk, который прародитель ООП, и который некоторые называют образцовым ООП-языком. Все объекты, в том числе и классы, и функции. Так что, это скорее современные языки отошли от "классического" ООП в пользу удобства и практичности.
1. ES7 (aka ES2016) — уже принят как стандарт и в нем нету декораторов
2. Декораторы на стадий 2 (из 4 https://github.com/tc39/proposals) как заявка на стандарт и нет уверенности что они войдут в состав стандарта следующего года ES2017
Все описание по тексту и выводы — TypeScript. Зачем вообще было упоминать про ES7?
Так же слегка напрягает описание костылей, которые заставляют декораторы работать, в середине статьи. Лично мне было бы приятнее видеть это в конце статьи.
Статья проработана, содержит примеры и тд. После прочтения я реально проникся идеей декораторов, но описанные мелочи слегка подпортили общее впечатление. Было бы приятно, если бы автор прислушался к моему скромному мнению.
Пакет reflect-metadata
уже идёт с .d.ts
, так что отдельно тайпинги ставить не надо.
Однако если вы используете Angular 2, то ваша система сборки уже может содержать в себе реализацию Reflect, и после установки пакета reflect-metadata вы можете получить runtime ошибку Unexpected value 'YourComponent' exported by the module 'YourModule'. В этом случае лучше установить только typings.
Это и не предлагалось.
Темная сторона TypeScript — @декораторы на примерах