【问题标题】:Passing Javascript object attribute to a function-Call by value将Javascript对象属性传递给函数-按值调用
【发布时间】:2014-06-08 06:52:38
【问题描述】:

我创建了一个具有一系列属性的 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))

显然,这里所有的引用都被删除了。我现在有一个可行的实现,但是,我仍然很想看看是否有更简单的方法将属性作为值传递。

编辑

解决了这个问题。根据保罗的回答,尝试了正常的逐步克隆和另一种使用 jquery 扩展方法的替代方法,如下所示

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

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

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

【问题讨论】:

  • iddata 是原始的吗?
  • 您要做的是克隆对象。你可以在这里读更多关于它的内容。 stackoverflow.com/questions/3774008/cloning-a-javascript-object
  • 抱歉遗漏了:id 是原始的,data 是 JSON。
  • @Smeegs:对于这么小的结果,似乎需要做很多工作。真的没有别的办法了吗?
  • 实际的 JSON(一个字符串)还是大家认为的 JSON 是什么(一个对象)?

标签: javascript


【解决方案1】:

JavaScript 中,原语 (Number, String) 被传递 ByValObjects (包括 Array, Function) 被传递ByRef

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

为了解决这个问题,clone 你的对象 在将它传递给这样的方法之前。

Array 具有要克隆的原生 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,所以它对您的选择有多好取决于对象的外观喜欢或正在对它做什么。

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

不要尝试克隆函数,它会出错。如果您需要以某种方式修改它们,请将它们包装起来。

【讨论】:

  • Thnaks,我使用 jquery 的扩展方法 var object = $.extend(true, {}, object) 实现了克隆对象
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    你只喜欢这种方法吗?

     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);
    

    【讨论】:

    • 图表与此无关。是一个错字。在问题中更改了它。非常抱歉。
    • 好的!所以只是一个问题:你为什么不试试这个? var ObjCt=function(id,data){this.id=id;this.data=data;} 并拨打var obj=new ObjCt(id,data); //process(obj.id,obj.data);
    • @Bellash data 在整个过程中仍然是一个参考
    猜你喜欢
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 2014-03-24
    相关资源
    最近更新 更多