
Dreamerinnoise
16.02.2017
07:07:21

Джон
16.02.2017
07:07:42

Alex
16.02.2017
07:09:24
ты такой злой, потому что в твоем языке типизации нет

Dreamerinnoise
16.02.2017
07:09:52
Да хер с ним с тайпскриптом, без него бы тоже стрелочные методы писал, что так сложно плагин воткнуть?

Google

Artem
16.02.2017
07:10:48
плагин для чего? Стрелочные функции в ES6 и так есть. Тут речь не про них, а про дефайн свойств в классе

Dreamerinnoise
16.02.2017
07:10:57
Я про это и говорю
Про дефайн свойств

Джон
16.02.2017
07:12:20

Dreamerinnoise
16.02.2017
07:13:48

Джон
16.02.2017
07:14:17
ага, это я понял. Выше кидали ссылку на доку реакта

Дмитрий
16.02.2017
07:14:29
Короче)
Пацаны, загуглите babel class properties

Dreamerinnoise
16.02.2017
07:15:21
По мне свойства это идиоматически правильно

Дмитрий
16.02.2017
07:15:33
И на самом деле это просто замечательно, что такую фичу наконец-то вводят

Artem
16.02.2017
07:16:43
По мне свойства это идиоматически правильно
это требует того, чтобы вообще все методы всех классов имели именно такое поведение. Этого нельзя гарантировать, если используешь чужой код. А иначе получается неконсистентность в коде и высока вероятность перепутать

Gordey
16.02.2017
07:17:07
какую фичу вводят? что за кипишь?
всем доброе утро

Google

Artem
16.02.2017
07:17:47
причём результат перепутывания может вылезти не сразу, например, если контект был не нужен когда писался код, но потом использования контекста добавилось и использующий код сломался потому что рассчитывал, что метод был задефайнен стрелочной функцией
есть классы со стандартным синтаксисом для методов, большинство ожидает именно этого

Дмитрий
16.02.2017
07:18:45
Ты вероятно не очень понимаешь, как их используют)

Dreamerinnoise
16.02.2017
07:18:48
Методы это методы

Джон
16.02.2017
07:18:50

Дмитрий
16.02.2017
07:19:05
Технически это и есть биндинги в конструкторе
Как бы

Artem
16.02.2017
07:19:11
в своём коде ты можешь "всегда", а в чужом - нет

Джон
16.02.2017
07:19:11
допустим для ивентов юзать только функции

Artem
16.02.2017
07:19:16

Дмитрий
16.02.2017
07:19:21
Нет
Как минимум потому что за описанные тобой классы в рабочем коде надо дважды прописывать — за кривой хак с контекстом и нарушение инкапсуляции

Artem
16.02.2017
07:20:27
Методы это методы
а ты тогда про что? Я думал ты предлагаешь вообще все методы дефайнить стрелочными функциями

Дмитрий
16.02.2017
07:20:56
Ну вообще ничто не мешает, но это не оч красиво просто-напросто

Dreamerinnoise
16.02.2017
07:20:57

Artem
16.02.2017
07:21:14

Дмитрий
16.02.2017
07:21:28
Если есть вероятность, что метод будет терять контекст — его записываем стрелочной функцией
И всё

Dreamerinnoise
16.02.2017
07:21:57
Ну в реакт классах я только так и делаю

Джон
16.02.2017
07:23:12
это что-то из разряда — а как лучше объявлять переменные. const или let ))

Google

Джон
16.02.2017
07:23:15
кек

Дмитрий
16.02.2017
07:23:29
Тут тоже никакой проблемы нет вообще

Джон
16.02.2017
07:23:36
ну так да
я о том же, че спорить то

Artem
16.02.2017
07:24:26
Если есть вероятность, что метод будет терять контекст — его записываем стрелочной функцией
тут я с тобой не согласен. Есть методы класса (не статические), их извне надо всегда вызывать так, как будто это обычные методы, т.е. явно задавать контекст если куда-то их передаёшь и хочешь контекст сохранить. Потому что полагаться на то, как задефайнен этот метод - это как раз нарушение инкапсуляции (если такое поведение явно не прописано в документации, потому что в этом случае это уже часть контракта)

Дмитрий
16.02.2017
07:25:53

Artem
16.02.2017
07:28:50
ну вот простенький пример, есть const foo = new Foo(); далее по коду у тебя setTimeout(foo.method.bind(foo), ...);. Правильно ли я понимаю, что ты предлагаешь дефайнить все методы стрелочными функциями и делать простоделать просто setTimeout(foo.method, ...);?

Дмитрий
16.02.2017
07:29:10
Да

Andrey ?
16.02.2017
07:29:13
Да

Дмитрий
16.02.2017
07:29:23
Потому что т тут при каждом вызове этого кода делаешь лишнюю работу
Если тебе это так важно, то можешь сделать упоминание в jsDoc метода

Artem
16.02.2017
07:30:22
именно так и надо делать, да

Дмитрий
16.02.2017
07:30:34
Каждый раз выполнять лишнюю работу?

Artem
16.02.2017
07:30:37
если не упоминается, то нельзя просто на это рассчитывать по умолчанию
нет, упоминать в документауции

Дмитрий
16.02.2017
07:30:45
Ну так упомяни
Не вижу проблемы
Минус перфоманса ради унификации (мнимой)?

Andrey ?
16.02.2017
07:31:11
У тебя в классе по определению все методы должны использовать this как обращение к экземпляру объекта. Перебайндивать просто потому что там удобный метод - следствие плохой архитектуры

Artem
16.02.2017
07:31:35
так и я не вижу. Просто по умолчанию нельзя рассчитывать что метод объявлен стрелочной функциеей, если это явно не прописано в описании контракта (например, в доке)

Google

Дмитрий
16.02.2017
07:31:49
Если тебе это так важно, то можешь сделать упоминание в jsDoc метода
Ну так упомяни
Не вижу проблемы

Andrey ?
16.02.2017
07:32:20
А, тут проблемой считается неочевидность прибайнденого метода...

Artem
16.02.2017
07:33:17
неочевидность того, как определён метод. JS, к сожалению, не позволяет явно это указать

? Алёна
16.02.2017
07:33:28

Dreamerinnoise
16.02.2017
07:33:36
Я тут бы опять хотел заехать с Тайпскриптом

Admin
ERROR: S client not available

Artem
16.02.2017
07:33:50
сделали бы декларацию методов через классы аналогом стрелочных функций - было бы отлично

Dreamerinnoise
16.02.2017
07:33:51
и сказать, что обычно стрелочные хендлеры у меня приватные
Но да ладно

Artem
16.02.2017
07:34:31
это вроде flow syntax, а не ES

Дмитрий
16.02.2017
07:34:50

? Алёна
16.02.2017
07:35:13

Artem
16.02.2017
07:36:07

Dreamerinnoise
16.02.2017
07:36:21
https://tc39.github.io/proposal-class-public-fields/
Погуглил за вас
Только он уже стейдж 2

Artem
16.02.2017
07:42:22
Ну у парня серьезная проблема — доку нельзя сделать, ето тайпскриптом не решить((
что-то ты не понимаешь про что я говорю. Я топлю за явное описание подобных штук в контракте, к сожалению, в JS это нельзя сделать средствами языка, поэтому приходится использовать документацию. Я против изменения дефолтов в проекте, когда все методы дефайнятся стрелочными функциями и в доке про это нигде не указано потому что "и так понятно"

Дмитрий
16.02.2017
07:43:49

Google

Artem
16.02.2017
07:44:28
ну и норм

Сергей
16.02.2017
07:48:02
Чем неправильно?
тем, что стрелочная как метод, то это не объявление метода, а присваивание функции свойству класса

Дмитрий
16.02.2017
07:48:29
И, вдогонку, чем это идеологически отличается от бинда в конструкторе?)

Сергей
16.02.2017
07:49:49
ты описываешь метод, а не проперти

Дмитрий
16.02.2017
07:49:58
Да, я описваю метод

Nikolay
16.02.2017
07:50:02
Чисто теоретически разницы вообще никакой )

Сергей
16.02.2017
07:50:02
методы попадают в prototype напрямую

Andrey ?
16.02.2017
07:50:06

Сергей
16.02.2017
07:50:19
бабель по разному компилит

Дмитрий
16.02.2017
07:50:21

Сергей
16.02.2017
07:50:47

Дмитрий
16.02.2017
07:51:36
Ну вообще при бинде ты именно что перезаписываешь свойство какой то функцией
По совпадению, той же самой
К тому же, ничто не мешает подправить реализацию чтобы объявлять реальный метод инстанса и биндить
Просто это никому не требуется)

Сергей
16.02.2017
07:52:57
а вот и разница подъехала