Evil Eval()不向对象添加属性

时间:2011-07-20 13:01:48

标签: javascript json object eval

我想将属性添加到具有动态属性名称的对象。

为此,我使用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
});

5 个答案:

答案 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中创建对属性的直接引用,因为对象在内部不起作用。属性名称本身就是引用。