Estoy empezando a usar JavaScript prototypal y tengo problemas para encontrar la forma de conservar una referencia this
al objeto principal desde el interior de una función de prototipo cuando cambia el alcance . Permítanme ilustrar lo que quiero decir (estoy usando jQuery aquí):Preservar una referencia a "esto" en las funciones de prototipo de JavaScript
MyClass = function() {
this.element = $('#element');
this.myValue = 'something';
// some more code
}
MyClass.prototype.myfunc = function() {
// at this point, "this" refers to the instance of MyClass
this.element.click(function() {
// at this point, "this" refers to the DOM element
// but what if I want to access the original "this.myValue"?
});
}
new MyClass();
Sé que puedo conservar una referencia al objeto principal al hacer esto al comienzo de myfunc
:
var myThis = this;
y luego usando myThis.myValue
para acceder a la propiedad del objeto principal. ¿Pero qué sucede cuando tengo un montón de funciones de prototipo en MyClass
? ¿Debo guardar la referencia al this
al principio de cada uno? Parece que debería haber una manera más limpia. Y qué decir de una situación como esta:
MyClass = function() {
this.elements $('.elements');
this.myValue = 'something';
this.elements.each(this.doSomething);
}
MyClass.prototype.doSomething = function() {
// operate on the element
}
new MyClass();
En ese caso, no puede crear una referencia al objeto principal con var myThis = this;
porque incluso el valor original de this
en el contexto de doSomething
es un objeto, y no jQuery
un objeto MyClass
.
Se me ha sugerido que use una variable global para mantener la referencia al this
original, pero eso me parece una idea realmente mala. No quiero contaminar el espacio de nombres global y parece que me impediría crear dos objetos diferentes MyClass
sin que interfieran entre sí.
¿Alguna sugerencia? ¿Hay una manera limpia de hacer lo que estoy buscando? ¿O es mi patrón de diseño completo defectuoso?
Me gusta mucho esta funcionalidad pero en un entorno jQuery me inclinaría a nombrarlo de otra forma dado el método jQuery.bind existente (aunque no existe un conflicto de nombres real). –
@Rob, es trivial hacer un método 'jQuery.bind' que se comporte de la misma manera que' Function.prototype.bind', verifique esta implementación simple: http://jsbin.com/aqavo/edit aunque lo consideraría cambiar su nombre, podría causar confusión con el método Events/bind ... – CMS
Recomiendo encarecidamente seguir con el nombre 'Function.prototype.bind'. Ahora es una parte estandarizada del lenguaje; no va a desaparecer – bobince