Javascript Evil Eval()未向对象添加属性

Javascript Evil Eval()未向对象添加属性,javascript,json,object,eval,Javascript,Json,Object,Eval,我想向具有动态属性名称的对象添加属性 为此,我使用了eval(),但编译器返回:意外标记。我正在做的是可能的,还是eval()不能用于str vars之类的对象 这是我的一些代码 var options = {}; // Creating empty object $("#selAdresse, #selCP, #selVille, #selPays, #selNom, #selDescription").live('change', function(){ var opt =

我想向具有动态属性名称的对象添加属性

为此,我使用了
eval()
,但编译器返回:
意外标记。我正在做的是可能的,还是
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
});
为什么不这样做呢

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
});
为什么不这样做呢

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
});

您不能使用
var
向对象添加属性。使用var最初声明变量:

var foo = {};
添加属性很简单:

foo.bar = null;
如果有包含属性名称的字符串,则使用方括号表示法:

var propName = 'bar';
foo[propName] = null;
编辑: 根据您对kbok的评论,方括号符号是您想要的:

var options = {};
options[ $( this ).attr( 'id' ) ] = 'Test';
结束编辑

针对您的问题(尽管您不应该这样做,并且有一些方法可以避免),您的评估的语法如下所示:

eval( 'foo.bar = null;' );

您不能使用
var
向对象添加属性。使用var最初声明变量:

var foo = {};
添加属性很简单:

foo.bar = null;
如果有包含属性名称的字符串,则使用方括号表示法:

var propName = 'bar';
foo[propName] = null;
编辑: 根据您对kbok的评论,方括号符号是您想要的:

var options = {};
options[ $( this ).attr( 'id' ) ] = 'Test';
结束编辑

针对您的问题(尽管您不应该这样做,并且有一些方法可以避免),您的评估的语法如下所示:

eval( 'foo.bar = null;' );

使用以下代码可以实现相同的行为:

var options = {};
options['lol'] = "Test"; // or options[$(this).attr('id')] = "Test"
console.log(options);

使用以下代码可以实现相同的行为:

var options = {};
options['lol'] = "Test"; // or options[$(this).attr('id')] = "Test"
console.log(options);

问题在于,您将对象属性视为它们自己的变量。它们的工作原理类似,但这意味着您不能声明它们。因此,当您说
var options.lol
时,解释器试图将
options.lol
解析为有效标识符,但显然不是。在Javascript中,您只需动态添加属性,无需在任何地方声明它们:

options.lol = 'Test';
此外,我假设您首先使用
eval
的原因是因为您不知道实际要设置什么属性。Javascript实际上有这样一种语法:

options['lol'] = 'Test';

实际上,您应该几乎从不需要使用
eval
来做任何事情。

问题在于您将对象属性视为它们自己的变量。它们的工作原理类似,但这意味着您不能声明它们。因此,当您说
var options.lol
时,解释器试图将
options.lol
解析为有效标识符,但显然不是。在Javascript中,您只需动态添加属性,无需在任何地方声明它们:

options.lol = 'Test';
此外,我假设您首先使用
eval
的原因是因为您不知道实际要设置什么属性。Javascript实际上有这样一种语法:

options['lol'] = 'Test';

实际上,您应该几乎从不需要使用
eval
来做任何事情。

查看注释和其他答案,您似乎在尝试获取对象属性的引用?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中创建对属性的直接引用,因为对象在内部不是这样工作的。属性名称本身就是引用

查看注释和其他答案,您似乎正在尝试获取对对象属性的引用?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中创建对属性的直接引用,因为对象在内部不是这样工作的。属性名称本身就是引用

哦,对不起,我的解释不清楚;这是因为我想做一些类似的事情:var opt=eval(“var options.”+$(this.attr('id'));//邪恶的评估();哦,对不起,我的解释不清楚;这是因为我想做一些类似的事情:var opt=eval(“var options.”+$(this.attr('id'));//邪恶的评估();为什么不写options.lol=“Test”。这似乎是在试图获取对对象属性的引用,无论是否使用eval,这都是不可能的。您只能获取对对象的引用(尽管对字符串、数字等的引用似乎不是引用,因为对象是不可变的)。为什么不写options.lol=“Test”。这似乎是试图获取对对象属性的引用,无论使用eval还是其他方法,这都是不可能的。您只能获取对对象的引用(尽管对字符串、数字等的引用似乎不是引用,因为这些对象是不可变的)。谢谢,我再也不会使用这个eval()!我的代码现在是options[$(this).attr('id')]=$(“option:selected”,this).val();谢谢你,我再也不用这个eval()了!我的代码现在是options[$(this).attr('id')]=$(“option:selected”,this).val();谢谢你,我要说的是再简单不过了,再快不过了!谢谢你,我要说的是再简单不过了,再快不过了!