将Javascript对象属性传递给函数 - 按值调用

时间:2014-04-23 12:28:38

标签: javascript

我创建了一个具有一系列属性的Javscript原型对象。我需要将其中一些属性传递给函数。该函数处理属性并返回一些结果。

function ObjCt(id,data) {
    this.id = id;
    this.data = data;
}

所以,我正在尝试将图表对象的数据传递给函数。我称之为:

var obj=new ObjCt(id,data);
process(obj.id,obj.data);

我从某处读到,在JS中传递值会导致按值调用,并且传递对象会导致按引用调用。在这里,我试图通过值调用,但是,似乎process()函数中发生的任何处理都反映在对象obj中。

我使用typeof检查了过程函数中收到的变量,它出现为'对象'而不是变量。那么,我该怎么做才能将这些数据作为值传递?

修改

我发现了一个相当无聊的解决方法。 id是原始的,data是JSON对象。所以,我在process()函数

中尝试了这个
JSON.parse(JSON.stringify(data))

显然,所有参考文献都在这里被删减了。我现在有一个工作实现,但是,我仍然希望看到是否有一种更简单的方法将属性作为值传递。

修改

解决了这个问题。根据Paul的回答,尝试了一步一步的正常克隆和另一种使用jquery扩展方法的替代方法,就像这样

var object=$.extend(true,{},oldObject);

并将新创建的对象传递给process()函数。

请参阅此链接:What is the most efficient way to deep clone an object in JavaScript?

3 个答案:

答案 0 :(得分:2)

JavaScript 中,原语( Number,String )传递 ByVal Objects (包括数组,函数)传递 ByRef

大多数情况下这没有任何区别,但是在使用修改 Object 的方法时可能会遇到问题,而不考虑您在其他地方也可能需要它。

为了解决这个问题,clone你的对象,然后再将其传递给这样的方法。

数组具有要克隆的本机Array.prototype.slice,对于 Objects ,您需要循环键并对属性进行递归。


要克隆的自定义功能,允许您通过instanceof测试扩展它以执行更多对象

function clone(o) {
    var o2 = {}, k;
    if (typeof o !== 'object')
        return o;
    if (o instanceof Array)
        return o.slice().map(clone);
    if (o instanceof Date)
        return new Date(o);
    for (k in o)
        if (Object.prototype.hasOwnProperty.call(o, k))
            o2[k] = clone(o[k]);
    return o2;
}

通过 JSON 克隆,只支持可以用 JSON 编写的内容

function clone(o) {
    return JSON.parse(JSON.stringify(o));
}

假装使用继承进行克隆
不会保护foo.bar.baz = primitive,但保护foo.bar = primitive,因此对您的选择有多好取决于 Object < / em>看起来像或正在做什么。

function pseudoclone(o) {
    return Object.create(o);
}

不要尝试克隆功能,它会发生可怕的错误。如果您需要以某种方式修改它们,请将它们包装起来。

答案 1 :(得分:0)

你是否只接受这种方法?

 var Chart=function(id,data){
     this.ObjCt = function () {
          this.id = id;
          this.data = data;
     }
 }

然后

  var obj=new Chart(id,data);
   obj.ObjCt();
  //process(obj.id,obj.data);

答案 2 :(得分:0)

假设id是原始的,data是一个对象:

function ObjCt(id, data){
    this.id = id;
    this.data = eval(data.toSource());
}

这将使用简单的技巧克隆data中保存的对象。