Bare words в JavaScript

    Однажды отдыхая в диване, я вспомнил мимолетный замечательный ролик из своего детства, который назывался WAT. И там была такая штука как bare words, которая показывалась на примере Ruby.

    image

    «Голые слова» (barewords) — это слова без кавычек, которые вы можете использовать в качестве строк.

    В JavaScript их, вроде как и нет, поэтому я попробовал их в него пропихнуть, что в целом получилось.

    Получился вот такой код:

    with(bareWords) {
        alert(Иван + Ургант)
        console.log(We, can, use, bare, words)
    }
    
    И он успешно выводил нужные фразы.
    А реализовано это было вот так:

    try {
        let self = this
        window.bareWords = new Proxy({}, {
            has: function(target, name) {
                return !(name in self)
            },
            get: function(target, name) {
                return name
            },
        })
    } catch(e) {
        console.error('Your browser doesn\'t support bare words.')
    }
    

    Как видите, чтобы мы смогли использовать голые слова, мы использовали такие фичи джаваскрипта, как Proxy и with.

    При попытке получить свойство из this, из-за происков with, запрос идет в прокси, где мы и возвращаем строковое значение вместо злобной ошибки о отсутствии переменной.

    Спасибо за внимание.

    image

    Если что, вот ссылочка на Github
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 33

      +1
      Троллейбус_из_хлеба.jpg
      • UFO just landed and posted this here
        +2
        Да, осталось прикрутить нейронную сеть, которая будет подставлять куски кода со stackoverflow по ассоциации с введенными словами и код писать сможет любой ребенок (с) 1C
        P.S. Проверять Proxy на defined с помощью try/catch жестко.
          0
          гавно какое то
            0
            Cоглашусь, но можно и корректнее :)
              0
              Всего лишь джаваскрипт.
              0
              ролик из своего детства
              — 2012 год.
              Детство-то когда кончилось? Пару лет назад?
                +2
                Пока еще не кончилось
                • UFO just landed and posted this here
                  0
                  Кстати, никогда не мог понять в чем прикол с Бэтменом? "...NaNNaN Batman!"?
                0
                Proxy вообще практически всемогущи, но сейчас они новы и медленны, лучше их не использовать.
                  0
                  А когда их лучше использовать? Когда они станут старыми и быстрыми, но совсем ничего не смогут делать?
                    0
                    А когда их лучше использовать? Когда они станут старыми и быстрыми

                    Да. Из этого правила можно сделать исключение, если бы были полифилы. Но для прокси — это не возможно.
                    совсем ничего не смогут делать?

                    Абсолютно никакой логической связи не вижу в этих словах, поясните, пожалуйста, как возраст фичи коррелируется с ее функциональностью?
                      0
                      Эта была шутка (в ответ на). Но… кто его знает? И… кто такие «полифилы»?
                        0
                        кто такие «полифилы»

                        https://learn.javascript.ru/dom-polyfill
                          0
                          Спасибо. Было очень вкусно. Ресурс понравился. Языком заинтересовался ещё больше.
                  +1
                  мы использовали такие фичи джаваскрипта, как Proxy и with.

                  Вообще, забавно получилось. with — это отмирающая фича, остается только для обратной совместимости и запрещена в strict mode. А Proxy — совсем новинка, только-только добравшаяся до браузеров.


                  Очень неожиданно встретить их вместе.

                    0
                    Вы разожгли мой аппетит. Теперь будет трудно уснуть, не узнав, что такое JavaScript, и с чём его едят.
                      0
                      Простите, я не хотел этого делать.
                        0
                        Лучше пожелайте мне приятного аппетита!
                      0

                      А еще так можно делать ленивую инициализацию. А вообще в смысле bare words лучше воспользоваться sweet.js. Правда на символ @ претендуют декораторы и похоже, что они его получат, так что придется использовать другой символ.

                        0
                        Ну там компиляция какая-то. Так не честно.
                          0

                          А with вообще deprecated, так что 1:1.

                            0
                            Го раз на раз
                              0
                              Испугался раз на раз, так что 2:1.
                            +1

                            Можно # взять и тогда весь код на js можно будет читать как ленту инстаграмма (rofl)

                              –1

                              Шарп слишком привычен для комментариев и вряд ли пройдет жернова TC39.

                                –2
                                Он на стейдж 2 забит под приватные свойства
                            +1
                            А вы хитры.
                            0
                            Подобный трюк в lua даже проще чем в js. Я иногда использую lua-скрипты вместо bat-ников, очень удобно таким образом обращаться к командному интерпретатору, переменным среды, реестру, и, в частности, его разделу Shell Folders. За счет установки __index и __call в metatable объектов cmd, SF и ENV работает, например, такое:

                            cmd.cls()
                            cmd.dir 'D:'
                            cmd.chcp '1251 > nul';
                            cmd.pause()
                            cmd.echo('ProgramFiles : ' .. ENV.ProgramFiles)
                            cmd.echo('SystemDrive  : ' .. ENV.SystemDrive)
                            cmd.echo('SystemRoot   : ' .. ENV.SystemRoot)
                            cmd.echo('UserProfile  : ' .. ENV.UserProfile)
                            cmd.echo('Common Documents: ' .. SF'Common Documents')
                            cmd.echo([[HKCU\Software\TortoiseHg: ]] .. REG[[HKCU\Software\TortoiseHg]])
                            cmd.pause()
                            

                            Only users with full accounts can post comments. Log in, please.