存储JavaScript对象的状态
我试图将“this”的统计信息存储在我的javscript对象中,以便稍后在我的应用程序中可以将“this”返回到以前的状态。我原以为我可以用闭包来完成,但到目前为止我还没有成功。我的想法是这样做存储JavaScript对象的状态,javascript,closures,Javascript,Closures,我试图将“this”的统计信息存储在我的javscript对象中,以便稍后在我的应用程序中可以将“this”返回到以前的状态。我原以为我可以用闭包来完成,但到目前为止我还没有成功。我的想法是这样做 function SavedFeature() { var self = this; this.savedItem; this.storeState = function() { this.savedItem = storeClosure(); }
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
方法,从而适应不同的环境。似乎深度复制是为整个对象完成此操作的唯一方法。