LINUX.ORG.RU

почему в JS принят такой стиль?

 ,


0

1

Я про классы. Когда мы пишем, например,

MyClass=function(){}
MyClass.prototype=someObject

следует, наверное, понимать, что классом тут является не MyClass, а MyClass.prototype, а MyClass является всего лишь конструктором, с опциональной инициализацией.

Соответственно, мы с тем же успехом можем писать

MyClass={
 create: function(){return Object.create(this)},
 //enother fields here
}
ну и в create мы можем опционально также инициализировать поля.

На мой взгляд, из-за этого дерьма происходит много путаницы. Многоие разработчики вообще тупо путают классы с конструкторами, да и собственно, кто сказал, что засирать без надобности глобальное пространство имен есть гуд?

Кроме всего прочего, во втором варианте код всегда лаконичней и ясней.

Почему массово принято это извращение? Это связано с оптимизацией, или что?



Последнее исправление: javaQest (всего исправлений: 3)

Ответ на: комментарий от Deleted

Разницы в сущности нет. Просто сахарные классы добавляют сложности на пустом месте.

javaQest
() автор топика
Ответ на: комментарий от special-k

Я не пойму, а что такого в этом вопросе? Почему ее должны удалить? Хотя, зная здешний модераторский состав, ты скорей всего прав. И все же?

javaQest
() автор топика

Скажи хотя бы кем он принят? В жаваскрипте 33.5 способа прикрутить симуляцию непрототипного наследования и неймспейсов. Почему ты взялся критиковать конкретно этот? Или почему ты решил, что твой метод лучше?

ya-betmen ★★★★★
()
Ответ на: комментарий от ya-betmen

В жаваскрипте 33.5 способа прикрутить симуляцию непрототипного наследования и неймспейсов. Почему ты взялся критиковать конкретно этот? Или почему ты решил, что твой метод лучше?

Не совсем понятно, что ты называешь симуляцией. Класс — это класс, а сахар для определения классов — это сахар. Класс не перестает быть классом, от того что нет сахара для его определения. Соответственно, в любой версии JS, за исключением, разво что майкросовтовского дерьма, JScript, который де факто, JS и даже диалектом EcmaScript не является

Касаемо преимуществ. Первое — это логичность. Второе — определение сабклассов. Допустим, у тебя есть некий SubMyClass. У него уже есть по дефолту create, тебе не надо дооопределять конструктор в глобале отдельно для него. Ни для него, ни для его детей.

javaQest
() автор топика

Вы путаете ООП и Прототипное наследование.

На хабре было несколько статей о прототипном наследовании, почитайте их. Ваша проблема из-за «своего самовара в чужом доме». Это как битрикс, они реализовали документарную БД поверх реляционной, вы пытаетесь налепить ООП поверх прототипов.

BaBL ★★★★★
()

Вот скажи, зачем ты опять прицепился к язычку, область применимости которого сводится к <a href='/rm' onclick='return confirm("Are you sure?")'>X</a>?

dexpl ★★★★★
()
Ответ на: комментарий от BaBL

Я ничего не понял, из вашего поста. Наследование — это одна из фич ООП, как можно перепутать общее с частным, хз. Прототипное наследование это тоже странноватое понятие, хотя и распространенное слово, оно имеет мадло смысла. Под этим, обычно понимается, видимо, наследование делегированием. По большому счету, это базворд ниочем.

javaQest
() автор топика
Ответ на: комментарий от dexpl

Вот скажи, зачем ты опять прицепился к язычку, область применимости которого сводится к <a href='/rm' onclick='return confirm(«Are you sure?»)'>X</a>?

А как же nodejs, angular и половина современного бэкенда?

BaBL ★★★★★
()
Ответ на: комментарий от dexpl

Ты лукавишь. JS сегодня — это самый распространенный ЯП. И не только клиентский, и даже не только серверный. С этим надо считаться.

javaQest
() автор топика

засирать без надобности глобальное пространство имен

Нинада его засирать.
Кто засирает слишком сильно — неправ.

Goury ★★★★★
()
Последнее исправление: Goury (всего исправлений: 1)
Ответ на: комментарий от BaBL

А как же nodejs, angular и половина современного бэкенда?

С нодейотэс, ангуляром и прочим подобным примерно так же, как с виндой на серверах — черт-те что, но имеет место, и этим даже зачем-то пользуются.

dexpl ★★★★★
()
Ответ на: комментарий от javaQest

Ты лукавишь. JS сегодня — это самый распространенный ЯП. И не только клиентский, и даже не только серверный.

Ага, поищи на типичном десктопе JS, заодно можешь и на серверах поискать, и на всяких адроидах и айосях. Его там окажется ничтожно мало. Ты смотришь на мир из своей узкой амбразурки вебелятора.

anonymous
()
Ответ на: комментарий от dexpl

Похоже, вы тут пытаетесь излить тут свою личную боль, основанную на религии. Не нужно этого делать, для этого есть психоаналитики:)

javaQest
() автор топика
Ответ на: комментарий от BaBL

А как же nodejs, angular и половина современного бэкенда?

Занимаются херней, да. Все так же выводят алерт, только теперь через жопу.

anonymous
()
Ответ на: комментарий от anonymous

Кстати, anonimus, открой уже для себя реакт. Это ж функциональщина, CS все дела. А то ангуляр, ангуляр.

anonymous
()
Ответ на: комментарий от javaQest

JS сегодня — это самый распространенный ЯП.

Йотэс може быть сколь угодно распространенным, это никак не отменяет того, что как был он язычком, созданным для <img onmouseover='…'>, так и остается. Один typeof null чего стоит.

dexpl ★★★★★
()
Ответ на: комментарий от dexpl

Я одно не понимаю, нафига вы ангуляр в бекенд записываете. Второй пост подряд. Я в целом согласен, но ангуляр не разу не серверная технология - это как раз то, где js царь.

А вообще, от всех этих серверных js становится грустно.

comp00 ★★★★
()
Ответ на: комментарий от javaQest

Похоже, вы тут пытаетесь излить тут свою личную боль, основанную на религии.

Ванга, перелогиньтесь.

dexpl ★★★★★
()
Ответ на: комментарий от Goury

не, он не серверный — он изоморфный. всерьез бекенды на js пишут редко, а вот серверный рендер — в тренде.

anonymous
()
Ответ на: комментарий от javaQest

Шоры то сними, бгг. Три секунды про руби увидел, остальные минуты про js нет.

anonymous
()
Ответ на: комментарий от javaQest

А при чем тут руби?

Там после про JS.

anonymous
()
Ответ на: комментарий от mix_mix

Ты пока не рассуждаешь про js создаешь впечатление очень умного парня) Это как сравнивать yesod c прелюдом.

anonymous
()
Ответ на: комментарий от dexpl

Я думаю, это связано с оптимизацией производительности. null на самом деле является примитивом. Концептуально, он должен был бы быть объектом, но его кастрировали. Это небольшой косячек, но ничего страшного в этом нет. В Ъ, конечно, null должен быть классом, наследующим от Object. в любом случае, это экземпляр Object.

Мне конечно не нравиться, что в JS есть примитивы, но такова конъюктура рынка, его приближают к быдлоязычкам.

javaQest
() автор топика

Прототипное наследование основано по сути на функциях. Где классов нет вообще. Есть функции, и от них можно «отпочковываться». Таких распространенных языков несколько: JavaScript, actionscript2, lua.

menangen ★★★★★
()
Ответ на: комментарий от mix_mix

Ты видел очень баянистый ролик на ютьюбе, где экскаватор воду из реки «черпает»? Вот по той же причине.

comp00 ★★★★
()
Последнее исправление: comp00 (всего исправлений: 1)
Ответ на: комментарий от anonymous

Ну правильно, я с JS не работаю практически, никаких фреймворков не знаю, просто вспомнилась статья неплохая :3

mix_mix ★★★★★
()
Ответ на: комментарий от dexpl

Я не понимаю. Нулевой объект имеет тип «объект». Тебя ведь не смущает, что \0 символ это таки символ? JS много за что можно (и нужно) ругать: за излишнюю слабость в типизации ({} + []), за относительно слабые регулярки и т.д., но вот почему typeof null всем не нравится, моя не понимат.

loyd
()
Ответ на: комментарий от mix_mix

ramda >> underscore (и вообще, если уж нужен синтаксис underscore, то есть lodash. И lodash-fp, который почти ramda).

http://buzzdecafe.github.io/code/2014/05/16/introducing-ramda/ — коротко об этом, там линкуют https://www.youtube.com/watch?v=m3svKOdZijA&app=desktop для тех, кому не лень смотреть полчаса видео.

x3al ★★★★★
()
Последнее исправление: x3al (всего исправлений: 1)
Ответ на: комментарий от menangen

Угу, а функция — это частный случай объекта, поэтому функциональные языки, это прототипные языки. Годная классификация.

javaQest
() автор топика
Ответ на: комментарий от loyd

Я в некоторой степени согласен с оратором в том смысле, что если бы JS был 100% Ъ, null должен был бы быть экземпляром класса Null, который, в свою очередь, сабкласс Object. Но это повлияет на скорость, современный Java - кодер наворочает с этим дров, перформанс сильно просядет. Поэтому, JS приспосабливается под говнокодеришек.

javaQest
() автор топика

Я про классы

там нет классов

umren ★★★★★
()
Ответ на: комментарий от loyd

Функция в чистом виде не может, только с окруением. А окружение, это снова объект:)

javaQest
() автор топика
Ответ на: комментарий от mix_mix

По статье кстати тоже есть претензии. Стал замечать, что хипстота, вместо простого и понятного цикла с мутацией внешней переменной стала городить зубодробительные однострочники (ramda), которые и выглядят и читаются как говно.

var getMatch = R.curry((val, type) => ({ [type]: R.head(R.match(matchers[type], val)) });
                       
var getMatchedWithType = (val, types) => R.compose(R.filter(R.compose(R.head, R.values)), R.map(getMatch(val)))(types);

Тут дело даже не в привычке, первый кусок в статье был самоочевиден. Потому что не было мусора из функциональщины, а только императивная суть что хотел сказать автор кода. Композиция сильно захламляет мысль.

anonymous
()
Ответ на: комментарий от anonymous

Мне кажется, подобная параша появляется тупо от непонимания ООП вообще, и ООП в JS в частности. Кстати, один мудило, по имени крокфорд, много усилий приложил, чтобы испоганить JS в эту сторону.

javaQest
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.