Вы действительно можете упростить этот справедливый бит:
var myClass = Class.create({
initialize: function() {
var self = this;
// To demo that we keep the instance reference, set a
// property on the instance
this.message = "Hi there";
$('formid').getElements().invoke("observe", "blur", blurHandler);
function blurHandler() {
// `self` references our instance
// `this` references the element we're observing
self.validateEl(this);
}
},
validateEl: function(el){
// validate $(el) in here...
// note that because of the way we called it, within this function,
// `this` references the instance, so for instance:
this.foo(); // alerts "Hi there!"
},
foo: function() {
alert(this.message);
}
});
, который использует invoke
(как вы предложили) и именованную функцию для обработчика (не нужно именовать, но я нахожучто очень полезно, чтобы у ваших функций были имена).Обработчик является закрытием.В функции initialize
я использую переменную для указания на this
, потому что переменная будет доступна для замыкания.(Я назвал это self
, потому что это стандартная практика, когда псевдоним this
по этой причине.) Обработчик использует встроенную функциональность Prototype для установки this
в обработчике событий для наблюдаемого элемента.Когда мы вызываем validateEl
через ссылку self
замыкания, мы вызываем ее как функцию-член, как обычно, поэтому в validateEl
, this
ссылается на экземпляр.
Говоря об именифункции, ваши функции initialize
и validateEl
являются анонимными, что означает, что в стеке вызовов и т. д. в отладчиках вы просто увидите "(?)", а не красивое, удобное имя.Я всегда рекомендую реальные именованные функции; больше здесь .