Javascript函数,对象

时间:2013-09-17 08:36:15

标签: javascript

我得到了一个以全局方式定义的对象:

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}

2 个答案:

答案 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;

}