Написано Тигран Байбурцян ✏️.
JavaScript никогда не был предназначен для классического языка программирования OOP, который был наиболее распространенным программированным идеологией, когда она была впервые разработана. Он должен был быть простым языком сценариев с несколькими функциями, такими как функции и структуры объектов JSON. Был всегда этот взлом, который заставил функцию JavaScript действовать как класс, но это был более распространен, чем преднамеренный дизайн.
Сегодня JavaScript работает практически на всех программных платформах и является одним из самых популярных и универсальных языков программирования в мире. В течение последних нескольких лет сообщество Ecmascript было формировать, что когда-то было очень простым языком в более надежном, чтобы помочь JavaScript поддерживать его доминирование. В результате у нас теперь есть полнофункциональные классы и могут делать гораздо больше, чем мы когда-либо представляли собой возможным с помощью JavaScript Отказ
Декораторы представляют один из самых важных шагов в этой эволюции, и они имеют решающее значение для хранения JavaScript конкурентоспособны с такими языками, как Java, Python, C # и т. Д. Давайте посмотрим на декораторы и посмотрим, как мы можем использовать их, чтобы получить больше функциональности из JavaScript.
Что такое декораторы?
Если вы являетесь разработчиком Python или Java, вы уже можете быть знакомы с термином декоратором. Но вопрос о том, следует ли оформлять декораторы в качестве основной языковой функции в JavaScript, были горячо обсуждены за эти годы. Нет простого задания для создания такой функции, не влияя на производительность языкового интерпретации, потому что это может напрямую влиять на то, как вы управляете функцией.
import { @logged } from "./logged.mjs"; class C { @logged method(arg) { this.#x = arg; } @logged set #x(value) { } } new C().method(1); // starting method with arguments 1 // starting set #x with arguments 1 // ending set #x // ending method
Например, @Logged
Декоратор, показанный выше, фактически включает функции и печатает журнал, когда вызывается заданная функция. Это может показаться легкой, чтобы добиться, но обертывание функции со многими декораторами может привести к переполнению стека, потому что это происходит в рекурсии со слишком многими функциями.
Вот почему декораторы являются одной из самых длинных запросов на функцию в сообществе ES. На самом деле это вторая итерация особенности. Он изо всех сил пытался получить широкое распространение в первый раз из-за вопросов потребления памяти для крупных приложений. Эта итерация оптимизирована, но кажется, что нам нужно будет дождаться, чтобы получить его вроде.
Написание пользовательского декоратора
Декоратор представляет собой простую функцию, которая получает функцию аргумента, которая будет называться. Это означает, что интерпретация должна обернуть оригинальную функцию с самой функцией декоратора и хранить его в памяти с исходным именем функции.
Давайте копаем код, чтобы нарисовать более четкую картинку.
// logged.mjs export decorator @logged { @wrap(f => { const name = f.name; function wrapped(...args) { console.log(`starting ${name} with arguments ${args.join(", ")}`); f.call(this, ...args); console.log(`ending ${name}`); } Object.defineProperty(wrapped, "name", { value: name, configurable: true }); return wrapped; }) }
Как видите, есть еще один декоратор, @wrap
на самом деле выполняет функциональную упаковку. Это одна из встроек встроенных декораторов, которые доступны для использования в любом месте:
@wrap
– заменить метод или весь класс с возвращаемой величиной данной функции@register
– Вызовите обратный вызов после создания класса@expose
– Вызовите обратный вызов с функциями для доступа к частным полям или методам после класса создано@initialize
– запустить обратный вызов при создании экземпляра класса
В этом конкретном случае у нас есть @Logged
Декоратор, который завернут в прошедшую функцию с использованием родных @wrap
декоратор.
Проблемы с джейтами и декораторами
JavaScript JIT может оптимизировать большинство корпусов использования кодирования, но он запускает только базовые оптимизации во время процесса разминки, где он инициализирует глобальную среду, функции и т. Д. Фактические декораторы проходят позже и обернут/измените уже оптимизированную функцию, что приводит к неоптимизированному коду. Позже, когда этот декоратор называется, JIT снова запустится для этого конкретного случая и оптимизировать его. Это означает, что более декораторы, которые у нас есть, тем более раз JIT будет работать во время «быстрой» фазы выполнения кода. Не удивительно, что декораторы считаются очень ресурсостойкими.
На сцену два предложения разработчики не полагаются на оптимизацию JIT. Вместо этого они попытаются оптимизировать вещи, сделав несколько предопределенных декораторов и построили другие на основе тех. Это должно помочь разрешить некоторые проблемы распределения памяти, потому что стандартные оптимизированные декораторы будут охватывать самые тяжелые операции.
Код статический анализ
Анализируя код JavaScript сложно, потому что нет стайных типов, которые функции возвращаются, а VSCode или Webstorm не всегда могут угадать, какая функция возвращается. С декораторами эта задача еще сложнее, потому что, по дизайну, декоратор, как @register
Изменит способ функции – и, следовательно, обратный тип – работает. Это означает, что сообщество ES несет ответственность за совокупность не только оптимизированного внедрения декораторов, но и все другие поддерживающие библиотеки и IDES.
Это время принять декораторы?
Немного рано использовать декораторы в производстве, но многие компании уже используют Typescript/Babel Decorators. Конечно, вы увидите некоторые ошибки отвлечения, рассказывая вам, что декоратор будет потреблять много памяти, но вы все еще можете использовать их. Сообщество ECMASSPST не имеет окончательных планов высказать его в производстве, но для кодеров JavaScript это второй шанс иметь полнофункциональный цикл программирования с помощью JavaScript.
Plug: Logrocket, DVR для веб-приложений
Logrocket Это инструмент для ведения журнала Frontend, который позволяет вам повторить проблемы, как если бы они произошли в вашем браузере. Вместо того, чтобы угадать, почему случаются ошибки, или просят пользователей на скриншоты и журнал свалки, Lognocket позволяет воспроизвести сеанс, чтобы быстро понять, что пошло не так. Он отлично работает с любым приложением, независимо от основ и имеет плагины для регистрации дополнительного контекста из Redux, Vuex и @ Ngrx/Store. В дополнение к регистрации действий и состояния Redux, Lognocket Records Console Logs, ошибки JavaScript, Stacktraces, Networks/Ответы с заголовками + тел, метаданные браузера и пользовательские журналы. Он также привлекает инструменты DOM для записи HTML и CSS на странице, воссоздая Pixel-Perfect видео даже самых сложных одностраничных приложений. Попробуйте бесплатно Отказ
Пост Новые декораторы предложения появился первым на Logocket blog Отказ
Оригинал: “https://dev.to/bnevilleoneill/new-decorators-proposal-342n”