我得到了一个以全局方式定义的对象:
window.myobj = {};
然后添加新元素,最后通过SaveData(obj)
函数通过ajax将其保存到数据库中。问题是,我在很短的时间内做了很多次,似乎传递给函数的东西只是指向一个单个对象的指针,所以当另一个事件发生时,它会在保存函数内发生变化,即使是在外面被改变了。在PHP中,你必须使用&$obj
...所以我该如何正确地执行它,所以传递给函数的obj不仅仅是一个指针?
编辑: 问题出现在这里:
让我们说event = {time:123,type:blah}
function SaveData(event){
obj = jQuery.extend({}, event); // doesn't seem to replicate event
$.post('save',obj,function(res){
if(res) console.log(obj);
});
if(obj.type == 'blah'){
newobj = jQuery.extend({}, obj);
newobj.type = 'newtype';
newobj.time = 234;
SaveData(newobj);
}else if(obj.type == 'newtype'){
newobj = jQuery.extend({}, obj);
newobj.type = 'lasttype';
newobj.time = 345;
SaveData(newobj);
}
}
这将返回3个相同的对象:
{time:345,type:lasttype}
答案 0 :(得分:0)
假设你的对象myobj
不包含任何函数,只包含值和其他对象,克隆对象(从而摆脱指针问题)的一种非常简单的方法是:
var clonedObj = JSON.parse(JSON.stringify(window.myobj));
现在,您可以将clonedObj
传递给SaveData
功能。
答案 1 :(得分:0)
如果你正在使用jQuery,那么答案很简单;
var myCopy = $.extend(true, {}, window.myobj);
如果没有,这个函数将创建一个深层复制对象 - 包括函数和嵌套对象;
function clone(original) {
if (original == null || typeof(original) !== 'object')
return original;
var theClone = original.constructor.call(this);
for (var property in original) {
theClone[property] = clone(original[property]);
}
return theClone;
}