"1) Какие существуют стратегии для прикрепления объектов к элементам HTML ..."
Поскольку вы используете .addEventListener()
, я бы посоветовал воспользоваться его функцией, о которой мало кто знает, как ... заставить ваш объект Dog
реализовать интерфейс EventListener
.
Это устанавливает очень четкие отношения между вашими данными Dog
и связанным с ними элементом.
Требуются только незначительные изменения. Сначала код ... объяснение ниже.
ДЕМО: http://jsfiddle.net/Ewgw5/1/
function Dog(name,id) {
this.name = name ? name : "spot";
this.id = id ? id : "dog";
this.el = document.getElementById(this.id);
// ---------------------------------v----no function!
this.el.addEventListener("click", this);
}
Dog.prototype = {
// Implement the `EventListener` interface
handleEvent: function(event) {
switch (event.type) {
case "click": return this.speak();
}
},
speak: function() {
console.log("this.name: "+this.name+"\nmyDog.name: "+myDog.name);
}
};
var myDog = new Dog("tye","dog1");
Поэтому все, что я сделал, это передал this
в конструкторе addEventListener()
вместо передачи функции, а затем я добавил handleEvent()
метод к Dog.prototype
.
Теперь, когда происходит событие "click"
, оно вызывает метод handleEvent()
. Значение this
в этом методе будет вашим Dog
экземпляром. Таким образом, оттуда вы можете вызывать любые методы, которые вам нужны.
Поскольку вы сделали элемент свойством this
, вы можете получить доступ к элементу через this.el
. Но это технически даже не нужно, поскольку элемент также доступен через объект event
как event.currentTarget
.
"2) Являются ли глобальные переменные в этом случае неизбежным злом ..."
К счастью, нет!
Это поведение должно быть частью вашей прокладки для .addEventListener()
.