Попробуй так:
//Запускаем
function testing() {
//создаём объекты наследующие прототип EventTarget
let myObj1 = new MyObj("obj1");
let myObj2 = new MyObj("obj2");
//Запускаем метод walk
myObj1.walk(7);//гулять 7 секунд
myObj2.walk(2);//гулять 2 секунды
//не забываем подписаться на события, генерируемы нашим объектом
myObj1.addEventListener("WalkBegin", onWalkBegin);//начало прогулки
myObj2.addEventListener("WalkBegin", onWalkBegin);
myObj1.addEventListener("WalkEnd", onWalkEnd);//конец прогулки
myObj2.addEventListener("WalkEnd", onWalkEnd);
}
//класс MyObj наследующий EventTarget
//По сути это новый объект EventTarget с расширенными свойствами и методами
function MyObj(name){
var eventTarget = new EventTarget();
eventTarget.name = name;//добавляем свойство имя
eventTarget.walk = (timeToWalkInSec) => { //добавляем метод гулять
eventTarget.dispatchEvent(new Event("WalkBegin")); //кидаем событие "начал гулять"
setTimeout( () => {
eventTarget.dispatchEvent(new Event("WalkEnd"));//кидаем событие "закончил гулять"
}, timeToWalkInSec * 1000);
}
return eventTarget; //!!! Ключевое место. Вместо того чтобы возвращать this мы возвращаем расширенный объект
}
function onWalkBegin(event){ //обработчик события
console.log(event.target.name + " begin walk");
}
function onWalkEnd(event){//обработчик события
console.log(event.target.name + " end walk");
}