使用“this”更新对象内的值

时间:2014-08-28 16:59:29

标签: javascript object

我正在尝试从对象本身更新值。我有以下代码:

    var stepData = {
        0: {
            ref: "Home",
            values: {

            },
            init: function(){
                stepData[1].ref = 'new value';
                alert(stepData[1].ref);
                return;
            },
            save: function(){

            }
        },
        1: {
            ref: "one"
        }
     }

    $("#run").click(function(){
        stepData[0].init();
    });

哪个工作正常。但是,我无法替换

stepData[1].ref = 'new value';
alert(stepData[1].ref);

this[1].ref = 'new value';
alert(this[1].ref);

为什么不呢?

编辑:抱歉,原始代码有误。现在修好了。

2 个答案:

答案 0 :(得分:1)

this主要由函数调用的方式设置,而不是在其定义的位置。你的代码:

$("#run").click(function(){
    stepData[0].init();
});

...在init设置为this时调用stepData[0]

如果您愿意, 可以<{1}}设置为this,并stepData使用Function#call

$("#run").click(function(){
    stepData[0].init.call(stepData);
});

从您对该问题的评论:

  

所以我得到它的方式还可以吗?

是的,只要stepData是单身,就不需要在其功能中使用this

有关this 的更多信息(在我的博客上)

答案 1 :(得分:0)

它无效,因为如果您拨打stepData[0].init(),则this会引用stepData[0],而不是stepData

改善这种情况的一种方法是使用立即调用的函数来创建对象:

var stepData = (function(){
    var mySelf = {
        0: {
            ref: "Home",
            values: {
            },
            init: function(){
                mySelf[1].ref = 'new value';
                alert(mySelf[1].ref);
                return;
            },
            save: function(){

            }
        },
        1: {
            ref: "one"
        }
    };

    return mySelf;
})();

以下内容将破坏您现在拥有的代码:

var newVariable = stepData;
stepData = null;
newVariable[0].init();

但它不会破坏上述方法。