Уважаемые форумчане, я делаю обсервер объектов, и мне нужна ваша помощь.
Это самое горячее место в моем коде, как лучше отслеживать изменения в обьектах? Как избегать переполнения стека при рекурсионных свойствах?
function Observer(target) {
this.target = target;
this.clone = {};
this.observers = {};
this._saveState();
}
Observer.prototype._saveState = function() {
var clone = {}; // update clone
var observers = this.observers;
var target = this.target;
for (var key in target) {
var value = target[key];
clone[key] = value;
if (typeof value === 'object' && !observers[key]) {
this.observers[key] = new Observer(value)
}
}
this.clone = clone;
};
Observer.prototype.changedKeys = function() {
var observers = this.observers;
var target = this.target;
var clone = this.clone;
var keys = [];
for (var key in target) {
if (target[key] === clone[key]) continue;
keys.push(key);
}
for (key in clone) {
if (keys.indexOf(key) !== -1) continue;
if (target[key] === clone[key]) continue;
keys.push(key);
}
for (key in observers) {
if (keys.indexOf(key) !== -1) continue;
if (observers[key].changed()) keys.push(key);
}
this._saveState();
return keys;
};
Observer.prototype.changed = function() {
return !!this.changedKeys().length
};
var obj = {};
obj.key = obj; // рекурсия
var observer = new Observer(obj); // и переполнение стека
Последний раз редактировалось Maxmaxmaximus.js, 29.05.2013 в 21:18.
|