假设我有一个从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
答案 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);
您可以传递myobject
,myobject.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");