Как стать автором
Обновить

Комментарии 33

Интересная и полезная статья, спасибо)

Стоит добавить, что некоторые декораторы написанные для ES7/Babel не будут работать в typescript, из-за особенностей того как он транспилит свойства.
Например такие декораторы как noneunemerable из core-decorators работать не будут (и почти все декораторы кооторые применяются к полям).

Мне одному начинает казаться, что из JavaScript пытаются обратно сделать Java?

потому что многих джавистов и сишарпистов заставили писать фронтенд, вот они и пытаются подстроить под себя непривычный язык
Да, давят на JS со всех сторон, стараcь превратить его в «нормальный язык».

Но пока JS не прогибается! ;-)
Судя о том, с каким успехом взлетели классы в различных фреймворках, а ещё и абстракции в TypeScript, то таки надежда не умирает! Авось и прогнется :)
>Судя о том, с каким успехом взлетели классы в различных фреймворках, а ещё и абстракции в TypeScript, то таки надежда не умирает! Авось и прогнется :)

Эх. Авось и нет. Ибо функциональщина на марше! (С) ;-)
Попытка такая уже была — внедрить ООП в JS — но не прошла.

Может и эта не пройдёт. ;-)

Вот, снизу постучали: «1. ES7 (aka ES2016) — уже принят как стандарт и в нем нету декораторов».

Так что — «Враг не пройдет!» (С)

;-)

Я вообще считаю, что последний JS это ES5. Всё что потом, это JS++. Очень уж его усложнили.

Нет, всё же С и С++ нельзя сравнивать с ES5 и ES6.

Особой сложности не заметил.

Новизна — это введение =>

И наконец-то визуально поправили написание класса. А то было просто смешно. ;-)

На сегодняшний день по данным таблички практически все умеют ES6. Думаю, сегодня можно уже смело использовать 'classes', 'arrow functions', 'promises' без головной боли.

Лихо Вы сбросили со счетов 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… В этих языках тоже нет интерфейсов. Они тоже не ООП? А при желании, можно реализовать интерфейсы в этих языках, но зачем?

bromzh > Я нашёл обзор 4-й версии. Хорошо, что этот трэш не приняли.

Ну, красивый язык был бы. Похожий на… остальные. ;-)
ООП — полное было бы реализовано.
Но… поругались там все, кто-то не успел реализовать что-то и… не пошёл 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

Спасибо, я смотрел все эти proposal, и так и не понял, приняли декораторы или нет. Жаль, конечно. Но все-таки stage 2 это уже немало.

>Жаль, конечно. Но все-таки stage 2 это уже немало.

Это просто шаг. Выкинуть могут и на стадии stage 4.

;-)
Слегка бомбануло после прочтения первой строки 2-го абзаца. ES7 уже вышел и в нем ничего нового уже не появится. Поэтому я просто оставлю это здесь.

Все описание по тексту и выводы — TypeScript. Зачем вообще было упоминать про ES7?

Так же слегка напрягает описание костылей, которые заставляют декораторы работать, в середине статьи. Лично мне было бы приятнее видеть это в конце статьи.

Статья проработана, содержит примеры и тд. После прочтения я реально проникся идеей декораторов, но описанные мелочи слегка подпортили общее впечатление. Было бы приятно, если бы автор прислушался к моему скромному мнению.

Мой косяк про ES7, убрал из статьи. Спасибо.

Я последние несколько месяцев фуллтаймово пишу на typescript. По сравнению с чистым js он прекрасен. Но проблема есть в том что никакие новые js не позволяют писать более производительный код для современных браузеров чем es3. Т.е. реально я ставлю таргетом es3 и не теряю в скорости. Да пришлось отказаться от геттеров и ещё некоторых конструкций но хуже не стало. Это очень печально. Язык ничего не делает для того чтобы стать более быстрым.

Интересно, на сколько же у Вас сложная логика на клиенте, что начинает сказываться производительность JS? Обычно тормозит DOM, или чудовищные алгоритмы (вроде неумеренных вотчей в Angular 1). И как Вы находите те самые 20% кода, которые выполняются 80% времени?

Не, я просто делаю игру, там вообще нет DOM, чистый webGL и иногда нормальная математика (поиски пути всякие, рейкасты, моделинг каких-либо процессов)
И как Вы находите те самые 20% кода, которые выполняются 80% времени?

Профилировщиком. Он даже в IE11 есть
Вообще хотелось сказать автору большое спасибо, писать такие вещи нужно и полезно.

Пакет reflect-metadata уже идёт с .d.ts, так что отдельно тайпинги ставить не надо.

Однако если вы используете Angular 2, то ваша система сборки уже может содержать в себе реализацию Reflect, и после установки пакета reflect-metadata вы можете получить runtime ошибку Unexpected value 'YourComponent' exported by the module 'YourModule'. В этом случае лучше установить только typings.

Это и не предлагалось.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий