我想将属性添加到具有动态属性名称的对象。
为此,我使用eval()
,但编译器返回:Unexpected token
。我正在做什么,或eval()
不能用于str vars等对象
这是我的一些代码
var options = {}; // Creating empty object
$("#selAdresse, #selCP, #selVille, #selPays, #selNom, #selDescription").live('change', function(){
var opt = eval("var options.lol"); // The evil eval();
opt = "Test"; // Trying to set options.lol = "test"
console.log(options); // Returning an empty object... Nothing change
});
答案 0 :(得分:1)
为什么不这样做?
var options = {}; // Creating empty object
$("#selAdresse, #selCP, #selVille, #selPays, #selNom, #selDescription").live('change', function(){
options.lol = "Test"; // Trying to set options.lol = "test"
console.log(options); // Returning an empty object... Nothing change
});
答案 1 :(得分:1)
您不使用var
向对象添加属性。您使用var来初始声明变量:
var foo = {};
添加属性很简单:
foo.bar = null;
如果您有包含属性名称的字符串,则使用方括号表示法:
var propName = 'bar';
foo[propName] = null;
修改强> 根据您对kbok的评论,方括号表示法是您想要的:
var options = {};
options[ $( this ).attr( 'id' ) ] = 'Test';
结束修改
要特定于您的问题(尽管您不应该这样做并且有办法避免它),您的eval的语法将如下所示:
eval( 'foo.bar = null;' );
答案 2 :(得分:1)
使用以下代码可以实现相同的行为:
var options = {};
options['lol'] = "Test"; // or options[$(this).attr('id')] = "Test"
console.log(options);
答案 3 :(得分:0)
问题在于您将对象属性视为自己的变量。它们的工作方式类似,但这意味着您无法声明它们。因此,当您说var options.lol
时,解释器会尝试将options.lol
解析为有效的标识符,但显然不是。在Javascript中,您可以动态地处理属性,无需在任何地方声明它们:
options.lol = 'Test';
此外,我假设您首先使用eval
的原因是因为您不知道您将实际设置的属性。 Javascript实际上有这样的语法:
options['lol'] = 'Test';
实际上,几乎从不需要使用eval
来做任何事情。
答案 4 :(得分:0)
查看评论&其他答案看起来你试图获得对象属性的引用? Javascript没有getter和setter的概念。无论如何都不能这样做。
但是,您可以将空对象定义为属性,并创建对该属性的引用。
var options = {}; // Creating empty object
options.lol={};
opt = options.lol;
// assign "text" sub-property of options.lol .. equiv. to options.lol.text="Test"
opt.text = "Test";
您还可以创建一个封装引用的函数:
// if falsy value is passed, then return current value. Will be limited because
// you can't assign a falsy value.
opt = function(text) {
if (text) {
options.lol=text;
} else {
return options.lol;
}
};
opt("Test");
alert(opt());
但是,绝对没有办法在javascript中创建对属性的直接引用,因为对象在内部不起作用。属性名称本身就是引用。