Firefox 34でES6構文の ComputedPropertyName が実装された
また、新しい構文。
オブジェクトリテラル中のプロパティ名部分に式を入れることができる様になる。
今まで
var prop = "foo"; var obj = {}; obj[prop] = "FOO Property";
今までは一旦オブジェクトを作ってから代入するしかなかったものが、
これから
var prop = "foo"; var obj = { [prop]: "FOO Property" };
とできるようになる。
プロパティ名の部分に、[expr]
と書く。
何が嬉しいの?
まぁ、普通に便利ですね。
と、これだけではアレなのでもう少し書くと、ECMAScript6thになってSymbolという型が登場し特殊なSymbol型のプロパティを定義できるわけだが、このComputedPropertyNameの構文がないとオブジェクトリテラルや将来的に実装されるであろうClass構文でSymbol型のプロパティを定義できるようにという図らいである。
より具体的には、Class構文でクラスを定義し、for-ofで回せるよう@@iterator
を定義したいとすると
class KeyValue { constructor() { // ... } set(key, value) { // ... } } KeyValue.prototype[Symbol.iterator] = function* () { for (var key of Object.keys(this).sort()) { yield [key, this[key]]; } };
などと書くとせっかくClass構文を使ってクラスっぽい書き方をしてラップしても内部のprototype
プロパティに直接アクセスとかしちゃってたら意味がなく馬鹿馬鹿しい。
どうせClass構文を使うなら、以下のように完全にクラスとして書けたほうが良い。
class KeyValue { constructor() { // ... } set(key, value) { // ... } *[Symbol.iterator]() { for (var key of Object.keys(this).sort()) { yield [key, this[key]]; } } }
ま、この辺りの考察は個人的なものだから実際はどうだか知らないけどね :P