如何在对象初始值设定项/文字中使用变量作为属性名称?

时间:2015-01-30 15:13:51

标签: javascript

我有这个功能:

function SaveToStore(thisObjName) {
  var thisObj = $('#'+thisObjName);
  chrome.storage.sync.set({
    "cbSO" : thisObj.is(':checked')
  });
}

我想使用包含thisObjName的参数"cbSO"作为我传入chrome.storage.sync.set的对象中的键(属性名称):

function SaveToStore(thisObjName) {
  var thisObj = $('#'+thisObjName);
  chrome.storage.sync.set({
    thisObjName : thisObj.is(':checked')
  });
}

但是,这会创建名为thisObjName的属性,而不是cbSO。如何使用参数的值作为键?

1 个答案:

答案 0 :(得分:2)

这个问题有两个答案:

  • ECMAScript5(ES5)及以下

  • 的答案
  • ECMAScript6(ES6)及以上的答案

ECMAScript5(ES5)及以下

的答案

您不能使用属性初始值设定项,:之前的部分始终使用字面,它不是一个被评估的表达式。

要使用变量中的名称创建属性,必须单独创建对象,然后使用括号表示法设置属性(然后将对象传递给函数):

function SaveToStore(thisObjName) {
  var thisObj = $('#'+thisObjName), args = {};
  args[thisObjName] = thisObj.is(':checked');
  chrome.storage.sync.set(args);
}

ECMAScript6(ES6)及以上

的答案

您可以使用property initializer中的计算属性名称执行此操作。它看起来像这样:

function SaveToStore(thisObjName) {
  var thisObj = $('#'+thisObjName);
  chrome.storage.sync.set({
      [thisObjName]: thisObj.is(':checked') // ES6 syntax! Not currently widespread
  });
}

请注意[]左侧thisObjName周围的: - 这些表示内部的内容是表达式,而不是文字