如何在ES5中使用计算属性名称?

时间:2015-09-02 09:29:30

标签: javascript ecmascript-5

我想要一个计算属性名称。我看到你可以在ES6中拥有它。但它应该与IOS Webview兼容。所以我不能使用ES6。还有 计算出的名称在循环内部将是相同的,如果这使得某人更容易。

任何想法?

var today = moment().format('DD.MM.YY');
for (var i = 0; i < 5; i++) {
    initialData.push(
         {
            dates: {
                "01.01.01": false
                 // instead of 01.01.01 i would like to have the value of today as the key
            }
        }
    )
}

2 个答案:

答案 0 :(得分:3)

你必须在ES5中采用精心设计的方式:

var today  = moment().format('DD.MM.YY');
var obj    = {};
obj[today] = false;
for (var i = 0; i < 5; i++) {
  initialData.push({ dates: obj });
}

(或者如果每次迭代的不同,则在循环内移动obj的创建)

答案 1 :(得分:0)

如果您碰巧具有充满ES6 +语法的代码(例如,计算所得的属性名称),并且想要使其与ES5兼容,那么到目前为止,最简单的方法是使用Babel之类的编译器来完成此操作您自动。这样一来,您就可以使用该语言的最新版本和最具可读性的代码来编写源代码,同时允许过时的浏览器理解已转译的代码,而而不必自己必须弄乱丑陋且冗长的ES5语法。 >

例如,如果您想要使ES5兼容的源代码如下:

const prop1 = 'foo';
const prop2 = 'bar';
const prop3 = 'baz';
const obj = {
  [prop1]: 'val1',
  [prop2]: 'val2',
  [prop3]: 'val3',
};

console.log(obj);

您可以run it through Babel自动获得ES5版本:

"use strict";

var _obj;

function _defineProperty(obj, key, value) {
  if (key in obj) {
    Object.defineProperty(obj, key, {
      value: value,
      enumerable: true,
      configurable: true,
      writable: true
    });
  } else {
    obj[key] = value;
  }
  return obj;
}

var prop1 = "foo";
var prop2 = "bar";
var prop3 = "baz";
var obj = ((_obj = {}),
_defineProperty(_obj, prop1, "val1"),
_defineProperty(_obj, prop2, "val2"),
_defineProperty(_obj, prop3, "val3"),
_obj);
console.log(obj);

转换后的代码可能看起来有些丑陋,但是大多数时候,您甚至不需要查看它,只需将其提供给客户端即可使用,即使在Internet Explorer之类的陈旧环境中也可以使用。