2012-09-26 141 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(+道具+” =“1月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"; 

这是有效的,而使用点符号来设置从vatiable索引或属性名称是不可能的。

+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,在调用之后获取垃圾回收,如果您的站点中包含underscore.js,则conformist元素将使用_.object()函数。

我希望内建的Object()和Array()函数允许以下划线方式传递键和值。JS做它:-)

+0

自我调用函数的下降是我的首选解决方案+1 – Fydo