Javascript передать объект по ссылке, а затем обновить - PullRequest
1 голос
/ 22 декабря 2011

Я искал по всему SO, и я знаю, что есть много тем об этом, но я не нашел ни одной, которая отвечала бы на мой вопрос.

Я видел вопрос о получении значения объекта обратноиз строки, подобной этой:

function getPropertyByString(str) {
    var properties = str.split(".");
    var myTempObject = window[properties[0]];
    for (var i = 1, length = properties.length; i < length; i++) {
        myTempObject = myTempObject[properties[i]];
    }
    return myTempObject;
}

Таким образом, если есть глобальная переменная myGlobalVar, вы можете передать строку myGlobalVar.someProp.stateName и, допустив, что все допустимо, вы получите значениенапример, stateName, например, Аризона.

Как я могу обновить это свойство в Калифорнии сейчас?

Если я попытаюсь

var x = getPropertyByString('myGlobalVar.someProp.stateName');
x = 'California';

, это обновит значение x, а не объекта.

Я попытался

var x = getPropertyByString('myGlobalVar.someProp.stateName');
x.value = 'California';

, который не сделаллибо не работает.

Может ли кто-нибудь помочь мне понять это на моем примере?

Спасибо

Ответы [ 2 ]

3 голосов
/ 22 декабря 2011

Попробуйте следующее;

function setPropertyByString(path, value) {
    var steps = path.split("."),
        obj = window,
        i = 0,
        cur;

    for (; i < steps.length - 1; i++) {
        cur = obj[steps[i]];

        if (cur !== undefined) {
            obj = cur;
        } else {
            break;
        };
    };

    obj[steps[i]] = value;
}

Это будет работать, используя его, как;

setPropertyByString('myGlobalVar.someProp.stateName', 'California');

Вы можете увидеть это в действии здесь; http://jsfiddle.net/xCK8J/

Причина, по которой вы не работали, состоит в том, что строки неизменяемы в JavaScript. Вы переопределяете переменную x со значением 'California', а не обновляете местоположение, на которое она указывает, чтобы быть 'California'.

Если бы вы сделали;

var x = getPropertyByString('myGlobalVar.someProp');
x.stateName = 'California';

Вы бы увидели, что это работает ; когда вы манипулируете объектом, на который указывает x, вместо того, чтобы переназначить x на что-то другое. Выше приведено то, что метод setPropertyByString() делает за кадром; это просто скрывает это от вас.

2 голосов
/ 22 декабря 2011

Это бы сработало:

myGlobalVar.someProp.stateName = "California"

Так было бы:

myGlobalVar["someProp"].stateName = "California"

или это:

myGlobalVar["someProp"]["stateName"] = "California"

В качестве альтернативы,

var x = getPropertyByString('myGlobalVar.someProp');
x.stateName = "California"

Обратите внимание, что если в моем последнем примере я сделаю что-то вроде этого:

x = {stateName:"California"};

Это не изменитсязначение myGlobalVar.someProp.stateName.

Использование = назначает новое значение переменной на LHS.Это не то же самое, что присвоение нового значения референту переменной.

...