Посмотрев на это некоторое время, я теперь понимаю, что EventTarget
фактически играет двойную роль: сущность, которая отправляет события, и сущность, которую слушают.Поэтому одним из вариантов было бы иметь Employee
наследовать goog.events.EventTarget
, но я пошел другим путем.
Сначала я создал новый тип события, который сообщал бы Боссу, если кофе был без кофеина.
/**
* @constructor
* @extends {goog.events.Event}
*/
foobar.CoffeeEvent = function(isDecaf)
{
goog.events.Event.call(this, 'COFFEE_ON');
this.isDecaf = isDecaf;
};
goog.inherits(foobar.CoffeeEvent, goog.events.Event);
Далее я создал тип прослушивателя событий для отправки этих событий.
/**
* @constructor
* @extends {goog.events.EventTarget}
*/
foobar.CoffeeEventTarget = function()
{
goog.events.EventTarget.call(this);
};
goog.inherits(foobar.CoffeeEventTarget, goog.events.EventTarget);
Я добавил объект этого типа в мой Employee
.
foobar.Employee = function()
{
...
this.coffeeEvents = new foobar.CoffeeEventTarget();
...
}
Когдаработник заправляет кофе:
foobar.Employee.prototype.makeCoffee = function(isDecaf)
{
this.coffeeMaker.putCoffeeInMachine(isDecaf);
this.coffeeMaker.start();
var event = new foobar.CoffeeEvent(isDecaf);
this.coffeeEvents.dispatchEvent(event);
}
г-н.Боссман прислушивается к этому.
foobar.Boss.prototype.addEmployee = function(employee)
{
...
goog.events.listen(employee.coffeeEvents, 'COFFEE_ON', function(e)
{
if (e.isDecaf)
{
this.refillMug();
}
}, false, this);
...
}
Обратите внимание, что это не скажет мне , какой сотрудник наполнил кофе, потому что целью события будет экземпляр CoffeeEventTarget
.Если бы вы хотели, чтобы все Employee
было там, я полагаю, вы можете добавить его в качестве поля участника.Если у вас все в порядке с наследованием Employee
от goog.events.EventTarget
, тогда вы получите Employee
бесплатно в качестве цели.