Pull to refresh
21
0
Send message

Неожиданный порядок инициализации наследованных классов в JavaScript

Reading time3 min
Views7.8K

Сегодня у меня была небольшая задачка на рефакторинг JS кода, и я натолкнулся на неожиданную особенность языка, о которой на протяжении 7 лет своего опыта программирования на этом ненавистном многими языке не задумывался и не сталкивался.


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


Чтобы не пользоваться традиционными и бессмысленными константами foo/bar, покажу непосредственно на примере, который был у нас в проекте, но всё же без кучи внутренней логики и с фейковыми значениями. Помните, что всё равно примеры получились довольно синтетические

Наступаем на грабли


Итак, у нас есть класс:


class BaseTooltip {
    template = 'baseTemplate'
    constructor(content) {
        this.render(content)
    }
    render(content) {
        console.log('render:', content, this.template)
    }
}

const tooltip = new BaseTooltip('content')
// render: content baseTemplate

Всё логично


А потом нам понадобилось создать другой тип тултипов, в котором изменяется поле template


class SpecialTooltip extends BaseTooltip {
    template = 'otherTemplate'
}

И вот тут меня ждал сюрприз, потому что при создании объекта нового типа происходит следующее


const specialTooltip = new SpecialTooltip('otherContent')
// render: otherContent baseTemplate
//                          ^ СТРАННО

Читать дальше →
Total votes 26: ↑18 and ↓8+10
Comments120

Redux. Простой как грабли

Reading time5 min
Views189K
Мне уже доводилось заглядывать в репозиторий библиотеки redux, но откуда-то появилась мысль углубиться в его реализацию. Своим в некотором роде шокирующим или даже разочаровывающим открытием я хотел бы поделиться с сообществом.

TL;DR: базовая логика redux помещается в 7 строк JS кода.

О redux вкратце (вольный перевод заголовка на гитхабе):
Redux — библиотека управления состоянием для приложений, написанных на JavaScript.

Она помогает писать приложения, которые ведут себя стабильно/предсказуемо, работают на разных окружениях (клиент/сервер/нативный код) и легко тестируемы.
Я склонировал репозиторий redux, открыл в редакторе папку с исходниками (игнорируя docs, examples и прочее) и взялся за ножницы клавишу Delete:

  • Удалил все комментарии из кода
    Каждый метод библиотеки задокументирован с помощью JSDoc весьма подробно
  • Убрал валидацию и логирование ошибок
    В каждом методе жёстко контролируются входные параметры с выведением очень приятных глазу подробных комментариев в консоль
  • Убрал методы bindActionCreators, subscribe, replaceReducer и observable.

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

А теперь давайте разберём то, что осталось
Читать дальше →
Total votes 52: ↑49 and ↓3+46
Comments159

Information

Rating
Does not participate
Registered
Activity