给函数赋予变量名但不赋值

时间:2011-12-26 21:39:31

标签: javascript

要删除繁琐的代码,我想创建一个简化它的功能 因此,为了更改我存储在对象中的设置,我创建了它。

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

它只会给函数赋值为'red' 而这:

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

显然不会起作用。

那么我该如何解决这个问题呢?我如何将变量传递给函数但不传递给它的值,以便可以改变它?

注意:此功能现在已简化,但在工作时会包含更多魔法。

2 个答案:

答案 0 :(得分:2)

对象和要更改的属性的名称作为单独的参数传递:

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

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

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

答案 1 :(得分:1)

当你进行settings.color时,你得到一个值,而不是对象。你必须做类似

的事情
function changeValue(object, field, value){
    object[field] = value;
}

一样使用
changeValue(settings, 'color', 'blue')

这可能根本不会减少你的时间..


EDIT :: 我为你做了这个功能。但请...不要使用它。

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