是否可以将对象属性作为JS中的引用传递?

时间:2015-06-29 11:09:05

标签: javascript

假设我有一个从xml文档生成的对象非常深,所以我可以达到如下值:

myobject.really[0].long.chain[43].to.travel.to.get.my[5].desired.$.value

如果我想根据它之前的值更新此属性,那么我可以这样做:

myobject.really[0].long.chain[43].to.travel.to.get.my[5].desired.$.value = 
updateFn(
  myobject.really[0].long.chain[43].to.travel.to.get.my[5].desired.$.value,
  otherparam1, otherparam2);

这使我的代码很难阅读,有没有很好的解决方案将参数作为引用传递而不是通过值?

那么我的代码看起来像这样:

updateFn(ref, param1, param2) {
  // "ref =" act as a reference, "(ref)" act as a value
  ref = someThingToDoWithTheOldValue(ref);
}

这样称呼:

updateFn(
  myobject.really[0].long.chain[43].to.travel.to.get.my[5].desired.$.value,
  otherparam1, otherparam2);
// So I can omit the myobject.really[0].long.chain[43].to.travel.to.get.my[5].desired.$.value =  part

2 个答案:

答案 0 :(得分:1)

您可以为任何内部属性指定变量名称。

var desired_$ = myobject.really[0].long.chain[43].to.travel.to.get.my[5].desired.$

desired_$所做的任何更改实际上都会反映在myobject.really...desired.$

desired_$.value = updateFn( desired_$.value, otherparam1, otherparam2);

您可以传递myobjectmyobject.really...desired.$.value仍然是您通过上面desired_$.value设置的内容。

  

这是否意味着如果我将'myobject.really [0] .long.chain [43] .to.travel.to.get.my [5] .desired。$'作为函数中的参数传递给那么它也会反映出原始物体上的暗物?

这取决于你实际用它做什么。这里是一般规则:如果更改对象上的属性,则对象保持不变 - 即您可以传递该对象,并且您更改的属性将保存您更改的值。

例如:

var obj = { outer: { inner: {prop: 1} } };

我有三个功能可以通过以下方式更改属性:

function changeProp(prop){
    prop = 2;
}
function changeInner(inner){
    inner.prop = 2;
}
function changeInnerCompletely(inner){
    inner = 2;
}

然后他们各自的影响将如此:

changeProp(obj.outer.inner.prop);
obj.outer.inner.prop //=> 1   // original unchanged

changeInner(obj.outer.inner);
obj.outer.inner.prop //=> 2   // original changed!

changeInnerCompletely(obj.outer.inner);
obj.outer.inner //=> 2        // original 'inner' itself changed

因此,只要更改对象上的 属性,原始对象就会反映更改。但是如果你完全改变了对象,那么“引用”就会被破坏,原始对象和传递给函数的对象现在是两个独立的实体。

答案 1 :(得分:0)

你可以做点什么

    function setProp(ref, prop, val)
    {
           ref[prop] = val;
    }

    ...
      setProp(myobject.really[0].long.chain[43].to.travel.to.get.my[5].desired.$, "value", "new Value");

但我怀疑这会让你的代码更具可读性......

<强> IDEA

为每个对象添加一个通用的setter:

    Object.prototype.setProp = function(prop, val)
    {
           this[prop] = val;
    }

然后:

myobject.really[0].long.chain[43].to.travel.to.get.my[5].desired.$.setProp("value", "new Value");

fiddle here