我是Javascript Object Literal的新手,我在理解这种逻辑背后的机制时遇到了问题,因此,我不知道在Google或SO中搜索正确的关键字。
以下是我的问题的一个例子:
var dialog = {
open: function(x){
console.log(JSON.stringify(x))
},
type: {
settings: {
controller: '',
click: false,
clas: ''
},
foo: function(){
this.settings.controller = 'Foo controller'
this.settings.clas = 'Foo class'
dialog.open(this.settings)
},
bar: function(){
this.settings.click = true
dialog.open(this.settings)
}
}
}
这是我的问题:
//A
dialog.type.foo();
//B
dialog.type.bar();
//C
dialog.type.foo();
为什么当我运行//C
时,dialog.type.settings
仍然保留foo
的值?
如何默认返回dialog.type.settings
?
答案 0 :(得分:2)
您只有一个对象可供使用,因此您在之前步骤中更改的任何内容都是"随身携带"直到你明确地改变它们。
每次我建议使用每次都返回一个新实例的函数并隐藏settings
和open
属性时,要使用新的对话框对象:
function dialog()
{
var settings = {
controller: '',
click: false,
clas: ''
},
open = function(x) {
console.log(JSON.stringify(x));
};
return {
type: {
foo: function() {
settings.controller = 'Foo controller';
settings.clas = 'Foo class';
open(settings);
},
bar: function() {
settings.click = true;
open(settings);
}
}
};
}
然后:
var a = dialog();
a.type.foo();
var b = dialog();
b.type.bar();
var c = dialog();
c.type.foo();
它避免了在各种上下文中使用this
时可能遇到的问题,因为settings
和open
始终在您从{返回的API的范围内{1}}功能。
答案 1 :(得分:1)
您的“foo”功能明确且有意地更改了这些“设置”属性的值。毕竟,只有一个“设置”对象。如果要还原值,则必须编写一个函数来执行此操作。