给变量名称,但不是函数的值

问题描述:

要删除繁琐的代码,我想创建一个函数来简化它。
所以要改变我存储在一个对象中的设置,我创建了这个。给变量名称,但不是函数的值

var settings = { 
    color : 'red' 
    //one of many settings 
}; 
alert(settings.color); // returns red 
function changeValue(property, value){ 
    settings.property = value; 
} 
changeValue('color', 'blue'); 
alert(settings.color); // still return red 

它看起来像它被视为一个字符串,而不是。
如果我试试这个:

function changeValue(object, value){ 
    object = value; 
} 
changeValue(settings.color, 'blue'); 

它只会给其功能是“红色”的价值。
这:

changeValue('settings.color', 'blue'); 

不会明显工作。

那么我该如何解决这个问题?我如何将一个变量传递给一个函数,而不是它的值,所以它可以被修改?

注意:该功能现在被简化了,但是它在工作时会包含更多的魔法。

当你做settings.color你得到一个值,而不是对象。你必须做一些像

function changeValue(object, field, value){ 
    object[field] = value; 
} 
使用像

changeValue(settings, 'color', 'blue') 

可能实际上并不能减少时间让你所有..


编辑:: 我已经这个功能适合你。但请..不要使用它。

var settings = { 
    color : "blue" 
} 

function setField(str, value){ 
    var args = str.split(".").reverse(); 
    var obj = window[args.pop()]; 
    while(args.length - 1 > 0) 
     obj = obj[args.pop()] 
    obj[args.pop()] = value; 
} 

alert(settings.color); 
setField("settings.color", "red"); 
alert(settings.color); 
+0

因为我想“删除繁琐的代码”,这肯定会违背它。 – 2011-12-26 21:54:00

+0

@EinarLöve'乏味的代码'?我的'解决方案'正是你想要的。 setField(“settings.color”,“red”)按照你的想法工作。我也给出了“正确”的做法。虽然你的原始要求是错误的,并且不应该使用这两种解决方案(包括lwburk的代码(与我的代码相同)) – AlanFoster 2011-12-26 21:56:08

+0

你的第一个功能绝对就是我正在寻找的东西。我以前的评论是对你的编辑作出的回应。 – 2011-12-26 21:59:51

传递对象和你想改变作为单独的参数属性的名称:

function changeValue(obj, prop, value) { 
    obj[prop] = value; 
} 

changeValue(settings, "color", "blue"); 

假设var prop = "color"然后obj[prop]相当于obj.color。第一种表示法允许您动态指定应该更改的属性。

+0

干杯。新的JavaScript,所以我不知道这种方法。 – 2011-12-26 21:47:32