Evil Eval () не добавляет свойство к объекту - PullRequest
0 голосов
/ 20 июля 2011

Я хотел бы добавить свойство к объекту с динамическим именем свойства.

Для этого я использую 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 ]

1 голос
/ 20 июля 2011

Вы не используете var для добавления свойства к объекту. Вы используете var для первоначального объявления переменной:

var foo = {};

Добавить свойства просто:

foo.bar = null;

Если у вас есть строка, содержащая имя свойства, вы используете квадратную скобку:

var propName = 'bar';
foo[propName] = null;

Edit: Исходя из вашего комментария к kbok, вам нужна квадратная скобка:

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

Конец редактирования

Чтобы быть конкретным в вашем вопросе (хотя вы не должны этого делать и есть способы избежать этого), синтаксис вашего eval будет выглядеть так:

eval( 'foo.bar = null;' );
1 голос
/ 20 июля 2011

Такое же поведение может быть достигнуто с помощью следующего кода:

var options = {};
options['lol'] = "Test"; // or options[$(this).attr('id')] = "Test"
console.log(options);
1 голос
/ 20 июля 2011

Почему бы просто не сделать это?

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
});
0 голосов
/ 20 июля 2011

Глядя на комментарии и другие ответы, кажется, что вы пытаетесь получить ссылку на свойство объекта? В Javascript нет понятия геттеров и сеттеров. Ты не можешь сделать это несмотря ни на что.

Однако вы можете определить пустой объект как свойство и создать ссылку на него.

  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, поскольку объекты просто не работают таким образом внутри. Само имя свойства является ссылкой.

0 голосов
/ 20 июля 2011

Проблема в том, что вы рассматриваете свойства объекта как их собственную переменную.Они работают аналогично, но это означает, что вы не можете их объявить.Поэтому, когда вы говорите var options.lol, интерпретатор пытается разобрать options.lol в качестве действительного идентификатора, чего, очевидно, нет.В Javascript вы можете просто динамически привязывать свойства, не нужно нигде их объявлять:

options.lol = 'Test';

Кроме того, я предполагаю, что причина, по которой вы используете eval, заключается в том, что вы этого не делаетезнать, какое свойство вы на самом деле будете устанавливать.Javascript на самом деле имеет синтаксис для этого:

options['lol'] = 'Test';

На самом деле, вы должны почти никогда нужно использовать eval, чтобы что-то делать.

...