JSFiddle - React, Tailwind, and code Playground

by kalinin sergey

JavaScript

class Events {
		  constructor () {
		    this.listeners = {}
		  }
		  get (event) {
		    return this.listeners[event] || (this.listeners[event] = new Set())
		  }
		  addListener (event, listener) {
		  	console.log('addListener start');
		    this.get(event).add(listener)
		  }
		  removeListener (event, listener) {
		    this.get(event).delete(listener)
		  }
		  trigger (event, ...args) {
		  	console.log('trigger start');
		    this.get(event).forEach(listener => listener(...args))
		  }
		}		

		class DOMelement {
			constructor() {
				console.log('construct dom element');
			}
		}

		class WINDOWelement {
			constructor() {
				console.log('construct window element');

				// user click simulation
				setTimeout(() => {
					console.log('user click to dom element');
					this.trigger('click');
				}, 3000);
			}
		}		

		const events = new Events();
		const domElement = new DOMelement();
		const windowElement = new WINDOWelement();

		domElement.__proto__ = events;
		windowElement.__proto__ = events;

		domElement.addListener('click', () => { console.log('is clicked') });