根据谓词是什么,您也许可以将您的问题放入observer pattern 的实现中。不久前,我写了一篇关于 creating JavaScript objects with observable properties 的博客文章。这实际上取决于谓词 是什么,但这可能会让您在大多数情况下使用如下代码:
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 支持自定义事件之前。D'oh!)再一次,这可能会或可能不会满足您的需求,但我认为这是一个有趣的 hack。享受吧!