В зависимости от предиката, вы можете приспособить вашу проблему к реализации схемы наблюдателя . Некоторое время назад я написал сообщение в блоге о создании объектов JavaScript с наблюдаемыми свойствами . Это действительно зависит от того, что предикат равен , но это может дать вам большую часть пути с таким кодом:
var observable = createObservable({ propToWatch: false });
observable.observe('propToWatch', function (oldValue, newValue) {
alert('propToWatch has changed from ' + oldValue + ' to ' + newValue);
});
observable.propToWatch(true); // alert pops
Конечно, это может быть излишним для вашего примера. Поскольку он никогда не указывается явно (например, я не очень хороший блоггер), вот полный код, необходимый для этой работы:
var createMediator = function () {
var events = {};
return {
subscribe: function (eventName, callback) {
events[eventName] = events[eventName] || [];
events[eventName].push(callback);
},
publish: function (eventName) {
var i, callbacks = events[eventName], args;
if (callbacks) {
args = Array.prototype.slice.call(arguments, 1);
for (i = 0; i < callbacks.length; i++) {
callbacks[i].apply(null, args);
}
}
}
};
};
var createObservable = function (properties) {
var notifier = createMediator(), createObservableProperty, observable;
createObservableProperty = function (propName, value) {
return function (newValue) {
var oldValue;
if (typeof newValue !== 'undefined' &&
value !== newValue) {
oldValue = value;
value = newValue;
notifier.publish(propName, oldValue, value);
}
return value;
};
};
observable = {
register: function (propName, value) {
this[propName] = createObservableProperty(propName, value);
this.observableProperties.push(propName);
},
observe: function (propName, observer) {
notifier.subscribe(propName, observer);
},
observableProperties: []
};
for (propName in properties) {
observable.register(propName, properties[propName]);
}
return observable;
};
Мои наблюдаемые объекты внутренне используют небольшую инфраструктуру обработки событий (функция createMediator), которую я однажды написал для проекта. ( До реализации пользовательских событий, поддерживаемых jQuery. Да!) Опять же, это может или не может быть излишним для вашей необходимости, но я подумал, что это забавный хак. Наслаждайтесь!