Ответы пользователя по тегу JavaScript
  • Зачем нужна инкапсуляция js?

    В данном примере вы, как мне кажется, путаете инкапсуляцию и сокрытие данных

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

    Javascript использует прототипное наследование, и в его реализации, традиционно, с сокрытием данных есть некоторые проблемы. Даже в "строго-типизированных" надстройках (например, в typescript), где в систему классов добавлены ключевые слова private и protected, защищенные свойства объектов все равно будут доступны извне на рантайме:
    // TypeScript
    class Foo {
        private bar = "lol"; // приватное поле класса
        baz = 42;
    }
    
    const foo = new Foo();
    console.log((foo as any).bar) // "lol"


    Если сокрытие данных на рантайме все-таки необходимо, его можно добиться с помощью замыканий и символов:
    const factory = () => {
        // используем замыкание, чтобы ограничить область видимости
        const privateProp = Symbol();
    
        function Foo() {
            // используем символ как идентификатор поля
            this[privateProp] = "lol";
            this.bar = 42;
        }
    
        return new Foo()
    }
    
    const foo = factory();
    
    // foo[privateProp] использовать невозможно вне замыкания
    console.log(foo.bar) // 42
    Ответ написан
    Комментировать
  • Почему не работает @connect?

    Не стоит использовать connect в качестве декоратора. Попробуйте так:
    export default connect(mapStateToProps, mapDispatchToProps)(MainLayout);

    Декораторы классов нужны для того, чтобы модифицировать поведение конструктора класса, поэтому TS требует строгого соответствия между декорируемым классом и результатом работы декорато-функции. В случае с connect происходит совсем другое: connect просто оборачивает компонент в компонент высшего порядка. Получается, что вместо модификации конструктора, декоратор-функция будет возвращать качествнно-новый класс.

    Гайд по применению connect в TS
    Ответ написан
  • Что значит и как перевести на русский tree shaking?

    Tree shaking (встряска дерева) — это функция некоторых бандлеров и анализаторов кода. Смысл заключается в том, что бандлер/анализатор просматривает весь код и строит на его основе абстрактное синтаксическое дерево (Abstract Syntax.... Говоря простым языком, это структура данных, с помощью которой компиляторы и машинные анализаторы "понимают" синтаксис кода: инструкции, объявления, вызовы в нем представлены ветвями и листьями. Именно об этом дереве и идет речь.

    "Встряхнуть" синтаксическое дерево — значит, вычислить, какие инструкции в коде никогда не вызываются и не исполняются, и удалить их из бандла, чтобы его облегчить. Аналогия в том, что когда трясешь натуральное дерево, засохшие листья и ветки отваливаются.
    Ответ написан
    Комментировать