Показать сообщение отдельно
  #146 (permalink)  
Старый 29.05.2013, 21:11
Аспирант
Посмотреть профиль Найти все сообщения от Maxmaxmaximus.js
 
Регистрация: 28.05.2013
Сообщений: 74

Уважаемые форумчане, я делаю обсервер объектов, и мне нужна ваша помощь.
Это самое горячее место в моем коде, как лучше отслеживать изменения в обьектах? Как избегать переполнения стека при рекурсионных свойствах?

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.
Ответить с цитированием