有没有办法创建一个对象并同时为它分配一个动态属性?

时间:2013-12-14 18:48:10

标签: javascript

这可能是一个愚蠢的问题,但我正在寻找一种既精确又简洁的方法来创建对象,使用对象文字符号,并为其指定动态属性。

现在,我这样做:

var foo = "lol";
var obj = {};
obj[foo] = "bar";
return obj;

// --> returns {lol:"bar"}

我想做这样的事情:

var foo = "lol";
return ({}[foo] = "bar");

// --> returns {lol:"bar"}

是否有某种模式可以做到这一点?我并不太关心可读性,尽管如果可能的话,我正在寻找紧凑的东西。

我可以这样做,但它非常大,而且非常像将语句分成多行。

var foo = "lol", obj;
return (obj = {}) && (obj[foo] = "bar") && obj;

4 个答案:

答案 0 :(得分:1)

编写一个简单的函数,它接受名称:值对作为连续的参数,如:

function dataBlob() {
  var args = arguments;
  for(var x = 0; x < arguments.length -1; x=x+2) {       
   this[args[x]] = args[x+1];
  }
  return this;
}

其中,假设我的JavaScript没有萎缩,上述内容毫无意义,可以用作:

var obj = dataBlob("lol","bar", "lolz", 42);

这相当于JSON-esque

var obj = {lol:"bar", lolz:42};

答案 1 :(得分:1)

jsFiddle Demo

您正在寻找Object.defineProperty MDN方法。您可以定义一个新对象并使用它来分配动态属性。

function test(){
 var foo = "lol";
 return Object.defineProperty({},foo,{value:"bar"});    
}

alert(test().lol);

答案 2 :(得分:1)

JSFidle Example

您可以将此方法添加到Object.prototype以获得强大的功能:

Object.prototype.push = function( key, value ){
   this[ key ] = value;
   return this;
}

var foo = "lol";
var obj = {};
obj.push(foo, "bar")

=>
Object {lol: "bar", push: function}

答案 3 :(得分:0)

不是基于功能的答案的忠实粉丝,我宁愿有某种表达方式。

我提出了更紧凑的形式:

var obj, foo = "lol";
return ((obj = {})[foo] = "bar") && obj;

如果我可以在表达式中包含var obj,那将会很酷。不确定如何。如果我不必定义obj变量,那将是最终的。