存储JavaScript对象的状态

存储JavaScript对象的状态,javascript,closures,Javascript,Closures,我试图将“this”的统计信息存储在我的javscript对象中,以便稍后在我的应用程序中可以将“this”返回到以前的状态。我原以为我可以用闭包来完成,但到目前为止我还没有成功。我的想法是这样做 function SavedFeature() { var self = this; this.savedItem; this.storeState = function() { this.savedItem = storeClosure(); }

我试图将“this”的统计信息存储在我的javscript对象中,以便稍后在我的应用程序中可以将“this”返回到以前的状态。我原以为我可以用闭包来完成,但到目前为止我还没有成功。我的想法是这样做

function SavedFeature() {
    var self = this;

    this.savedItem;

    this.storeState = function() {
        this.savedItem = storeClosure();
    }

    function storeClosure() {
        var closure = self;
        return function() {
            return closure;
        };
    };

    //other things the user can change...
}
所以稍后在我的应用程序中,如果我需要返回到调用storeState的时候,我可以这样做

//return the object I put in my closure
var backToNormal = savedFeature.savedItem();
但这不起作用,因为调用storeState()后对savedFeature对象所做的任何更改都会反映在我从被调用的savedItem()检索的项中。我猜这是因为闭包被设置为self的引用,而不是复制到新实例


是否有任何方法可以将整个对象的状态存储在这样的闭包中,还是需要以其他方式存储

有几十种方法可以实现它。我只做一个简单的。拯救财产。 考虑如果要保存整个对象,则需要对对象进行深度复制

这是您的功能:

function SavedFeature() {
        this.savedItem = {'isNew': true};
        this.stateMachine = new StateMachine();
}
这是某种状态机:

function StateMachine () {
      var state = { 'isNew' : null};
      function set(newState) {
         state.isNew = newState.isNew;
      }
      function get() {
         return state.isNew;
      }
      return {
      get : get,
      set : set
      };
    }
其中,知道如何存储是新的属性

和一个工作样本:

 var savedFeature = new SavedFeature();
 console.log(savedFeature.savedItem); //  true by default

 savedFeature.stateMachine.set(savedFeature.savedItem); // saving state.
 savedFeature.savedItem.isNew = false; // modifying state
 console.log(savedFeature.savedItem); // return false, because of statement above

 var restoredState = savedFeature.stateMachine.get(); // restoring state
 console.log(restoredState); // true

 savedFeature.savedItem.isNew = restoredState.isNew;
 console.log(savedFeature.savedItem); // true

您可以调整代码,并获得所需的任何功能。希望这有帮助

您遇到的问题是,在js中,对象是通过引用传递的。这意味着对对象执行的所有更改都将应用于
obj.savedItem
属性

修复:将深度克隆存储到
obj.savedItem

 this.storeState = function() {
     this.savedItem = _.cloneDeep(this); // or _.clone(this, true);
 }
cloneDeep
是一种方法,大多数js库都提供自己的方法,例如jQuery等

你可以很容易地滚动你自己的深层克隆功能,在上面查找选项

jQuery的完整示例:

function SavedFeature() {
    this.savedItem;

    this.clone = function() {
       return $.extend(true, {}, this);
    },

    this.storeState = function() {
        this.savedItem = this.clone();
    }
}

通过这种方式,您可以在复制使用过的库方法时更改
clone
方法,从而适应不同的环境。

似乎深度复制是为整个对象完成此操作的唯一方法。