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
    Метки:
    Поделиться публикацией
    Похожие публикации
    Комментарии 33
    • +1
      Троллейбус_из_хлеба.jpg
      • НЛО прилетело и опубликовало эту надпись здесь
      • +2
        Да, осталось прикрутить нейронную сеть, которая будет подставлять куски кода со stackoverflow по ассоциации с введенными словами и код писать сможет любой ребенок (с) 1C
        P.S. Проверять Proxy на defined с помощью try/catch жестко.
        • 0
          гавно какое то
          • 0
            Cоглашусь, но можно и корректнее :)
            • 0
              Всего лишь джаваскрипт.
            • 0
              ролик из своего детства
              — 2012 год.
              Детство-то когда кончилось? Пару лет назад?
            • 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.

                    • +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()
                      

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