1. JavaScript / Говнокод #12613

    +157

    1. 1
    if (!("" instanceof String)) throw new Error("Empty string is not a string");

    Майкрософт. JScript, ASP.

    Запостил: wvxvw, 19 Февраля 2013

    Комментарии (31) RSS

    • В каких-то старых версиях"" была не строкой?
      Ответить
      • Не, через жопу реализован instanceof - он вообще, как оказалось, работает только для Object и Array.
        Ответить
    • Ох ха-ха-ха... не, это так всегда в жабоскрипте, и не только в JScript'e. Вообще это так типа и должно быть :)
      Поздно уже, надо домой идти.
      Есть три класса и две функции, чтобы определить к какому классу отностися объект. fml.
      Ответить
      • "Есть три класса и две функции, чтобы определить к какому классу отностися объект. fml."

        В жабаскрипте есть классы?? Что я проспал???

        Там же вроде только тот хак с ассоциативными массивами был?
        Ответить
        • String, Number, Object и т.п. - эти честные классы, все остальное - условно.
          Ответить
          • Нет там никаких классов - ни честных, ни лживых.

            > typeof String
            "function"
            > typeof Number
            "function"
            > typeof Object
            "function"

            > String instanceof Function
            true
            > Number instanceof Function
            true
            > Object instanceof Function
            true
            Ответить
            • И эти люди потом идут и срут на js. Потому что там "скучное ООП".
              Кстати меня всегда удивляла одна мелочь, зачем разрешили писать new без скобок, вот так:
              (new String).length
              >> Object instanceof Function
              >true

              >Function instanceof Object
              true
              В чем-то @wvxvw прав.
              Ответить
              • В вершинах иерархии объектных систем всегда происходят занятные вещи.
                >>> isinstance(object, type)
                True
                >>> isinstance(type, object)
                True
                >>> type(type) is type
                True
                >>> type(object) is type
                True
                Ответить
            • Ну так есть и глобальные функции, с такими же именами. Во многих языках принято называть конструктор тем же именем, что и класс, например. Пользователю жабоскрипта классы вряд ли понадобятся, т.как нечего с ними особо делать, а вот функции - да, поэтому, наверное, и выбрали такой способ назвать. А может не хотели вдаваться в полемику, и сэкономили на класс тегах таким образом... хз, логику в жабоскрипте все равно искать не стоит.
              Кстати, RegExp в некоторых реализациях - тоже функция, а в других - не очень. И в этом нет никакой логики, просто так получилось.
              Ответить
              • >Ну так есть и глобальные функции, с такими же именами.

                Нет. Ни с такими же именами, ни с другими.

                ECMA-262, 4.2.1 Objects (p.3):
                >ECMAScript does not use classes such as those in C++, Smalltalk, or Java.
                http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

                Есть внутреннее свойство [[Class]], которое является строкой, и значение можно получить при помощи вызова `Object.prototype.toString.call(someObj) `.

                А классов нет.
                Ответить
                • Бла-бла-бла. Жабоскрипт - это множество стандартов, и в четвертом, опять же, слово класс вполне себе фиругировало и имело конкретный смысл. Тут кому-то захотелось поиграть на публику - а публика благодарная, восприимчивая и впечатлительная, ну так че же.
                  Но не нужно упускать из виду главный момент. Логики в жабоскрипте небыло никогда, а все его стандарты - феерический бред. Как Крокфорд говорил в своем автобиографическом интервью: "первый раз, когда я это увидел, я дико смеялся и не мог поверить, что кто-то бы всерьез использовал это недоразумение, но потом я понял, что могло быть и хуже". Ну, ему как бы не с руки хаять жабоскрипт, он на нем практически карьеру сделал, но по глазам видно, когда говорит, сколько неразделенной печали кроется за этим "на первый взгляд...".
                  Ответить
                  • Я знаю о недостатках JS и мне даже PHP версии 5.3+ нравится куда больше. Но ваша критика совершенно неконструктивна. Особенно момент с чтением "истинного" отношения Крокфорда к JS по глазам - это прием уличной гадалки.
                    Ответить
                  • Во всех живых языках много нелогичных, а порой и откровенно глупых моментов. На момент их создания люди пытались внедрить что-то принципиально новое с нескучными обоями, но мало кто может предсказать последствия принятых решений. Даже учёт опыта предыдущих языков не помогает. Даже решения, кажущиеся всем разумными, могут на деле оказаться полной лажей.

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

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

                    Правдив старый анекдот - серьёзная разработка - как секс. Одна ошибка, и тебе придётся поддерживать её всю жизнь.

                    А задним умом всяк крепок.
                    Ответить
                    • показать все, что скрытоВо-во, да-да, я гадалка, и у всех есть проблемы (естесствено, разница между плакать на велосипеде и в БМВ незначительна и сравнивать бессмысленно).
                      Смысл не в том, что у всех есть проблемы - это и ежу понятно, а в том, что на общем фоне, ну, разве что ВБСкрипт только хуже. Ну есть еще Ант и XSLT, хз, на Коболе писать не приходилось... еще есть масса мелочи типа AWK, всяких там проприетарных языков (особенно таких, которые используют в дико дорогих CI серверах / эмуляторах).
                      НО... ведь было же до того, как был жабоскрипт. Люди ведь уже к тому времени изобрели хорошие вещи, теория была известна, существовала практика. И тем не менее, это говно живет и здравствует и по сей день :(

                      ЗЫ. А вот и та самая цитата, нашел таки:
                      https://www.youtube.com/watch?v=Trurfqh_6fQ&feature=player_detailpage#t=1880s
                      Ответить
                    • показать все, что скрытоО, да, и еще, как раз похожий случай, один в один судьба жабоскрипта. Вот общаюсь я со старожилами унаследованого проекта. Они тоже его не писали, а унаследовали. Проект феерического бреда. Я даже не думал, что может быть так плохо... смешно, что я как-то ухитряюсь идти вниз по карьерной лестнице, при чем с самого начала :)
                      Ну да не суть. Так вот, проект - отборное говно, и всегда таким был, но люди которые над ним работали потеряли какую-либо надежду его исправить в виду просто феноменального идиотизма изначальных авторов. Но со временем это изза того, что проект не развивался а "поддерживался", он на столько ухудшился, что сейчас при всем большом желании с ним уже ничего не поделать. Но, как говорит один из старожилов "но оно же, сука, работает!"
                      Жабоскрипт находится в очень похожей ситуации: он не развивается, это уебищная система, которая должна была умереть много лет назад, примерно тогда же, когда должен был умереть XML, sendmail, HTTP и HTML но все эти технологии каким-то образом продолжают существовать и их аудитория только увеличивается :(
                      Ответить
                      • Более того, я разрабатываю несколько мелких систем и унутре у них движком совсем не lua. Посмотрим, кто сдохнет раньше.

                        P.S. Firefox 18+ достаточно быстр, чтобы прямо из него играть в порт Cube3D на JS (yandex:Bananabread). Пока ещё проба технологии, но за этим будущее.
                        Ответить
                • https://www.youtube.com/watch?v=v2ifWcnQs6M&list=PL5586336C26BDB324&feature=player_detailpage#t=200s
                  Ответить
                • https://www.youtube.com/watch?v=Trurfqh_6fQ&feature=player_detailpage#t=260s
                  Ответить
    • вот оно, попытка натянуть ООП на ОП. Что и требовалось доказать, через какое место.
      Ответить
    • Гениально. Вот оно - непонимание основ. Примитивы есть примитивы, объекты - объекты.
      console.log(11 instanceof Number) //=> false
      console.log(new Number(11) instanceof Number) //=>true
      console.log('string' instanceof String) //=>false
      console.log(new String('string') instanceof String) //=>true
      console.log(false instanceof Boolean) //=>false
      console.log(new Boolean(false) instanceof Boolean) //=>true

      Автор - лол.
      Ответить
      • О боже, изобличители, никуда от них не скрыться! Вы бы может авторский комментарий почитали сначала.
        Ну да не важно, а важно то, что незыблимые основы не были такими незыблимыми несколько лет назад, и в ЕС4 было принято решение сделать так, чтобы new String("foo") и "foo" были бы одним и тем же. Поразительная находка, после полутора десятков лет мытарств и недоумений закрадывавшихся порой в обьзьянью умы "жабоскрипт программистов". Но потом решили, да ну и хер с ним, сделать из этого говна все равно ничего путнего не получится, ну так вернем все как было, пусть обезьянки еще порезвятся немного.
        Ответить
    • Экзистенциалисты писали, походу.
      Ответить
    • Блять, тру оопэшники уже "затрулились"?
      Вот ваши "инстансы":

      console.log(obj.constructor == Object);
      console.log(obj.constructor == Array);
      console.log(obj.constructor == String);
      console.log(obj.constructor == Number);
      console.log(obj.constructor == Boolean);
      и т.д по кастомным..

      Реализует вашу задачу? Да.
      В чем проблема?
      Ответить
      • Еще один:)
        delete Fn.prototype.constructor
        Fn.prototype = { запишу ка я так методы своего "класса" }
        Fn.prototype.constructor = Boolean // А я бульён

        Нужно узнать внутренний класс - как уже выше было сказано:
        function classof(obj){
          return String.prototype.toString.call(obj).slice(8,-1)}

        Нужно проверить нахождение в цепочке прототипов - instanceof, isPrototypeOf.
        Всё.
        Ответить
        • fix: Object.prototype.toString
          Ответить
        • Прям таки всегда колбасишь прототипы и переопределяешь конструктор, ага.
          У языка изначально своя концепция.
          Почему бы не принять её такой, какая она есть, а не навешивать "удобные" баребухи?
          Ответить
          • Обычно я их колбашу куда более страшными способами.
            А вот 90% мартышек делает просто:
            function fn1(){}
            fn1.prototype={/* переопределение объектом прототипа без возврата конструктора на родину у них в порядке вещей */ }
            function fn2(){}
            function fn3(){}
            fn3.prototype=new fn2 /* самый простой вариант наследования - та же хрень - конструктор в инстансах fn3 - fn2*/

            Концепция у js своя и этот ваш constructor оставьте себе - Object.create куда прототипному языку ближе.
            Ответить
            • 90% мартышек никогда не слышали про прототипы и колбасят все в глобальной области видимости.
              Ответить
        • от дурака защиты не существует
          Ответить

    Добавить комментарий