class Event {
}
class EventTarget {
  constructor () {
    this.listeners = {}
  }
  getEventListeners (event) {
    return this.listeners[event] || (this.listeners[event] = new Set())
  }
  addEventListener (event, listener) {
    this.getEventListeners(event).add(listener)
  }
  removeEventListener (event, listener) {
    this.getEventListeners(event).delete(listener)
  }
  dispatchEvent (event, ...args) {
    this.getEventListeners(event).forEach(listener => listener(...args))
  }
}
class Element extends EventTarget {
}
class HTMLElement extends Element {
  click () {
    this.dispatchEvent('click', new Event())
  }
}
class HTMLDivElement extends HTMLElement {
}
const div = new HTMLDivElement() // тоже что в браузере document.createElement('div')
div.addEventListener('click', e => console.log(e))
div.click()// когда в системе стоит ru-RU
function getDateFormat () {...}
expect(getDateFormat()).toBeEqual({
  format: 'дд.мм.гггг',
  day: 'дд',
  month: 'мм',
  year: 'гггг'
})проблема в том, что при использовании ООП в UI-компонентах, все потомки становятся очень хрупкими.вы имеете ввиду наследование как в SuperButton1 или в целом?