根據謂詞的不同,你可能會把你的問題放到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支持的自定義事件。哦!)再次,這可能會或可能不會過度滿足您的需要,但我認爲這是一個有趣的黑客攻擊。請享用!
謂詞是什麼? – SLaks 2010-02-19 13:37:29
@predicate是函數,動作也是函數 – zaharpopov 2010-02-19 13:41:29
謂詞是在動作被調用之前必須爲真的條件。 ** ==> **聽起來對我來說很合理。 – AxelEckenberger 2010-02-19 13:42:43