Приведенное выше решение хорошо, но более пригодный для повторного использования способ состоит в том, чтобы «привязать» ваш метод к контексту, создав метод, который создает это закрытие для вас. Например
Function.bind = function(method, context) {
return function() {
return method.apply(context, arguments);
}
}
Следуя примеру Слакса, вы получите:
document.body.onmousedown = Function.bind(this.OnMouseDown,this);
document.body.onmouseup = Function.bind(this.OnMouseUp, this);
или вы можете сделать это для Function.prototype для синтаксического сахара.
Function.prototype.bind = function(context) {
return function() {
// since this is a prototype method, "this" is the method to be called
return this.apply(context, arguments);
}
}
document.body.onmousedown = this.OnMouseDown.bind(this);
document.body.onmouseup = this.OnMouseUp.bind(this);
Вы также можете связать аргументы для вызова, а также контекст ... спросить, если вы заинтересованы.
Синглтонный подход, хотя он и работает, является взломом. Это добавляет глобальные перемены вместо правильного решения проблем. Это означает, что если вам нужно поведение в двух местах, оно не будет работать.