我试图将“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() 后对保存的功能对象的任何更改都会反映在我从调用的保存项()检索的项目中。我猜测发生这种情况是因为闭包被设置为 self 的引用而不是复制到新实例。
无论如何,是否可以将整个对象的状态存储在这样的闭包中,或者我是否需要以其他方式存储它。
您遇到的问题是在 js 中对象是通过引用传递的。这意味着对您的对象执行的所有更改都将应用于您的obj.savedItem
财产。
修复:将深度克隆存储到obj.savedItem
this.storeState = function() {
this.savedItem = _.cloneDeep(this); // or _.clone(this, true);
}
cloneDeep
is a lodash http://lodash.com/方法,大多数 js 库都提供自己的方法之一,例如jQuery 的$.extend http://api.jquery.com/jquery.extend/, etc.
您可以轻松地推出自己的深度克隆功能,查找此选项thread https://stackoverflow.com/questions/122102/most-efficient-way-to-clone-an-object/122704#122704.
一个完整的 jQuery 示例:
function SavedFeature() {
this.savedItem;
this.clone = function() {
return $.extend(true, {}, this);
},
this.storeState = function() {
this.savedItem = this.clone();
}
}
这样做可以让您通过改变自己的方式来适应不同的环境。clone
方法,因为它面向所使用的库方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)