2012-09-26 2 views
14

JavaScript дает вам много способов объявить объекты. Если у вас есть большинство имеющихся под рукой данных, наиболее удобный (на мой взгляд) выглядит следующим образом:Синтаксис объявления объекта JavaScript - имена переменных как свойства

var person = { 
    name: 'John', 
    age: 23 
}; // "object literal syntax" 

Любопытная вещь об этом синтаксисе, что он идентичен этому:

var person = { 
    'name': 'John', 
    'age': 23 
}; // "object literal syntax" 

То есть вы можете использовать кавычки или опускать их для имен свойств.

При сравнении, что к установлению единой работы собственности образом, у вас есть два варианта:

person.birthday = "January 12"; // "dot syntax" 

или

person['birthday'] = "January 12"; // "array syntax" 

«дот синтаксиса» работает только когда правый операнд является фактическим Имя свойства. Если вы хотите использовать переменную для имени свойства, вы должны использовать «синтаксис массива», то есть:

var prop = "birthday"; 
person[prop] = "January 12"; 

Теперь, можно использовать переменную для имени свойства в «объект синтаксиса литерала» ? Поскольку это не имеет значения, если вы укажете имена свойств, не существует очевидного способа использовать переменную там. Я ищу что-то вроде этого:

var prop = "birthday"; 
var person = { 
    name: 'John', 
    age: 23, 
    (prop): 'January 12' 
}; 

Здесь я использую (проп) в качестве мнимого синтаксис, используемый, чтобы выразить, что это переменная, а не символьная строка.

Спасибо.

+0

Я думаю, что вы должны придерживаться синтаксиса массива .. возможно Eval (+ проп + = «12 января «) будет делать трюк, но я не думаю, что это оптимальное решение. –

+1

@PhilippeBoissonneault - Ack! Eval * не требуется *, пожалуйста, не используйте его в этом контексте. –

+0

Вы ищете эквивалент переменных переменных PHP: '$ foo = bar; $ bar = '123'; echo $$ foo; // фактически отображает '123'' – Ray

ответ

3

ES6 теперь позволяет это: «человек»

var obj = { 
    [prop]: 'value' 
}; 
7

Нет, это не сработает, поэтому, если вы динамически задаете имена свойств, предлагается и используется массив, такой как нотация.

var k='propertyname'; 
object[k]="value"; 

Это работает при использовании точечной нотации, чтобы установить индекс или имя свойства из жизнеспособного, невозможно.

+0

Я считаю, что фраза «скобковая нотация» является предпочтительной, но в остальном, да. –

2

Вы не можете сделать это с объектами, но если вы считаете, с помощью функции конструктора вместо этого, он мог бы выглядеть примерно так:

var prop = "birthday"; 
var Person = function() { 
    this.name = "Bob"; 
    this[prop] = "January 12"; 
}; 
var bob = new Person(); 

Конечно, вы все еще имеют обозначение массива здесь, но, возможно, вам нравится это все равно :) Подход

4

для людей, которые нуждаются в прямой заменой для точечного синтаксиса, где ключи являются объектами вместо строк (скажем, для гнездования внутри родительского объекта), вот некоторые обходные пути:

var developers = { 
    person: { 
     'name': 'John', 
     'age': 23 
    }, 
    anarchist: (function(){ var a = {}; 
     a['name'] = 'John'; 
     a['age'] = 23; 
     a[false] = false; 
     a[1] = 1; 
     a[window] = window; 
    return a; })(), 
    conformist: _.object([ 
     ['name', 'John'], 
     ['age', 23], 
     [false, false], 
     [1, 1], 
     [window, window] 
    ]) 
}; 

// console.log(developers); // <- to see var dump in Firebug 

Элемент anarchist использует self-executing-function, который получает мусор, собранный после вызова, а элемент-конформист использует функцию _.object(), если вы можете включить underscore.js на свой сайт.

Я хочу, чтобы встроенные функции Object() и Array() допускали передачу ключами и значениями под знаком подчеркивания.JS делает это :-)

+0

Капля функций самозаведения - это мое предпочтительное решение +1 – Fydo

Смежные вопросы