我正在尝试从对象本身更新值。我有以下代码:
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);
为什么不呢?
编辑:抱歉,原始代码有误。现在修好了。
答案 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();
但它不会破坏上述方法。