I've generalized my lack of understanding of the situation to this small problem. Here's what I think I know so far:
I have an object myDog
(a global variable). Dog
has a member variable el
that is an html element; because it's an element, I can add event listeners to it. So, when you click on myDog.el
, it logs to the console the values of this.name
and myDog.name
. As expected because of scope, this.name
is undefined and myDog.name
is 'tye'. this
inside of Dog.speak
when invoked by the click event listener refers to the element that was clicked, the member variable el
, not the object Dog
. Since myDog
is a global variable, it's able to pick back up regardless of the function's scope and get to myDog.name
just fine.
See code below:
function Dog(name,id) {
this.name = name ? name : "spot";
this.id = id ? id : "dog";
this.el = document.getElementById(this.id); // given there is a div with a matching
this.el.addEventListener("click",this.speak); // ignore IE for simplicity (attachEvent has its own 'this' scope issues)
}
Dog.prototype = {
speak: function() {
console.log("this.name: "+this.name+"\nmyDog.name: "+myDog.name);
}
};
var myDog = new Dog("tye","dog1");
So... my questions are
1) What are some strategies for attaching objects to html elements, so that I can go from this.el
back to myDog
(this.el
's owner) without myDog
being a global variable?
2) Are global variables in this case a necessary evil? And if so, what are so good strategies in this case to gracefully use them? For example, what if I wanted 100 dogs instantiated? How would I handle all those global variables in Dog.speak
?
Here's a jsfiddle version if you want to play with it: http://jsfiddle.net/chadhutchins/Ewgw5/