0

我有一个对象定义的全局方式:

window.myobj = {};

然后添加新元素,最后通过 ajax 按SaveData(obj)功能将其保存到数据库中。问题是,我在短时间内做了很多次,似乎传递给函数的只是一个指向一个对象的指针,所以当另一个事件发生时,它会在保存函数内部发生变化,即使它外面改了。在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}
4

2 回答 2

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;

}
于 2013-09-17T08:53:34.707 回答
0

假设您的 Objectmyobj不包含任何函数,而仅包含值和其他对象,那么克隆 Object 的一种非常简单的方法(从而摆脱指针的问题)将是:

var clonedObj = JSON.parse(JSON.stringify(window.myobj));

现在您可以将 传递clonedObj给您的SaveData函数。

于 2013-09-17T08:42:51.323 回答