(extraído alguna explicación que estaba oculto en los comentarios en otra respuesta)
El problema radica en la siguiente línea:
this.dom.addEventListener("click", self.onclick, false);
Aquí, se pasa un objeto de función que se utilizará como devolución de llamada . Cuando se activa el evento, se llama a la función, pero ahora no tiene asociación con ningún objeto (esto).
El problema puede ser resuelto envolviendo la función (con el mismo de la referencia de objeto) en un cierre de la siguiente manera:
this.dom.addEventListener(
"click",
function(event) {self.onclick(event)},
false);
Puesto que la variable auto fue asignado este cuando se creó el cierre, la función de cierre recordará el valor de la variable auto cuando se llame en un momento posterior.
Una forma alternativa de resolver esto es para hacer una función de utilidad (y evitar el uso de variables para la unión este):
function bind(scope, fn) {
return function() {
fn.apply(scope, arguments);
};
}
El código actualizado tendría el siguiente aspecto:
this.dom.addEventListener("click", bind(this, this.onclick), false);
Function.prototype.bind
es parte de ECMAScript 5 y ofrece la misma funcionalidad. Por lo que puede hacer:
this.dom.addEventListener("click", this.onclick.bind(this), false);
Para los navegadores que no soportan ES5 embargo, MDN provides the following shim:
if (!Function.prototype.bind) {
Function.prototype.bind = function (oThis) {
if (typeof this !== "function") {
// closest thing possible to the ECMAScript 5 internal IsCallable function
throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
}
var aArgs = Array.prototype.slice.call(arguments, 1),
fToBind = this,
fNOP = function() {},
fBound = function() {
return fToBind.apply(this instanceof fNOP
? this
: oThis || window,
aArgs.concat(Array.prototype.slice.call(arguments)));
};
fNOP.prototype = this.prototype;
fBound.prototype = new fNOP();
return fBound;
};
}
¡La función de utilidad createCallback es útil! Gracias. –
closure() es probablemente un nombre mejor. – hishadow
O bind() o bindMethod(). – outis