'use strict'

class EventEmitter {
  constructor(name) {
    this.eventName = name;
    this.target = [];
    
  }

  emit(msg) {
    for (let i = 0; i < this.target.length; i++) {
      this.target[i]._events[this.eventName] += msg;
    }
  }
}

class EventListener {
  constructor() {
    Object.defineProperty(this, '_events', {
      configurable: true,
      enumerable: false,
      value: {},
      writable: false
    });
  }

  on(eventName, eventEmitter, handler) {
    eventEmitter = eventEmitter || new EventEmitter();
    eventEmitter.target.push(this);
    let that = this;
    Object.defineProperty(this._events, eventName, {
      configurable: true,
    set: (v) => {
      setTimeout(() => {
        handler.call(that);
      }, 0);
      }
    });
  }
}

@@ -92,16 +92,17 @@
 s.target
+s
  = %5B%5D;%0A 
@@ -159,16 +159,17 @@
 s.target
+s
 .length;
@@ -193,16 +193,17 @@
 s.target
+s
 %5Bi%5D._eve
@@ -222,17 +222,16 @@
 ntName%5D 
-+
 = msg;%0A 
@@ -526,24 +526,28 @@
 tter();%0A    
+if (
 eventEmitter
@@ -553,16 +553,68 @@
 r.target
+s.indexOf(this) === -1) %7B%0A      eventEmitter.targets
 .push(th
@@ -618,16 +618,22 @@
 (this);%0A
+    %7D%0A
     let 
@@ -728,16 +728,18 @@
 ue,%0A    
+  
 set: (v)
@@ -740,24 +740,26 @@
 t: (v) =%3E %7B%0A
+  
       setTim
@@ -779,16 +779,18 @@
         
+ 
+ 
 handler.
@@ -801,16 +801,18 @@
 (that);%0A
+  
       %7D,
@@ -828,18 +828,43 @@
   %7D%0A    %7D);%0A
+    return eventEmitter;%0A
   %7D%0A%7D%0A

Update event.js