ECMAScript 6th 2011-11-07 Draft

ECMAScript 6thのドラフト(harmony:specification_drafts [ES Wiki])が更新されてる。

よって、自分が作っている構文抽出版を更新したよ。


今回の変更分について幾つか。

  • SealedArrayLiteral, SealedObjectLiteral
  • PropertyAssignmentに新たなパターン
  • MemberExpression にいろいろ追加
    • super keyword
    • <| operator

SealedArrayLiteral, SealedObjectLiteral

ES-DiscussのML(# proposal extensions (Was: Re: Sep 26 meeting notes))を読むに、#が先頭に付いたリテラル値はSeal(configurable: false, extensible: false)状態になるみたい。

var sArray = #[0,1,2,3];
sArray[3] = 4; // writableはtrueなのでOK
delete sArray[3]; // configurableがfalseなのでNG
sArray.push(5); // extensibleがfalseなのでNG (TypeError: sArray.push(5) is not extensible)

ただ、##で freaze となる構文は入っていないみたい。リジェクトされた? 詳細はよく分からない。教えて詳しい人><。

PropertyAssignmentに新たなパターン

PropertyAssignment:
 IdentifierName
 PropertyName : AssignmentExpression
 PropertyName ( FormalParameterList ) { FunctionBody }
 get PropertyName ( ) { FunctionBody }
 set PropertyName ( PropertySetParameterList ) { FunctionBody } 

3番目のPropertyName ( FormalParameterList ) { FunctionBody }部分が追加されている。

var obj = {
  func() {
    return "function";
  },
};

みたいに書けるってことだと思われる。

MemberExression

追加分のみ書くよ。(今までFunctionExpressionがあったのが別のところに移ったとかもあるけど)

MemberExpression:
  super [ Expression ]
  super . IdentifierName
  MemberExpression <| SealedArrayLiteral
  MemberExrepssion <| SealedObjectLiteral
  MemberExpression <| FunctionExpression
  MemberExpression <| ValueLiteral
super キーワード

詳細は載っていないが、名前から察するに、待望の親クラス...じゃなくて親プロトタイプを参照できる、thisに並ぶキーワードと思われる。
が、詳細が分からない。プロトタイプチェーンを一つ上ったオブジェクトを指すような気もするし。他の例を見ると、コンストラクタ関数からsuper()としていたりするしで、正直混乱中。CallExpressionの場合は、親コンストラクタだったり、親の同名のメソッドを指したりする?

<| 演算子

クラスのextendに相当すると思われる。

今まで、クラス(っぽいもの)の継承に

function Person (name) {
  this.name = name;
}
Person.prototype = {
  describe: function () {
    return "Person called " + this.name;
  }
}

function Employee (name, title) {
  Person.call(this, name);
  this.title = title;
}
Employee.prototype = {
  __proto__: Person.prototype,
  describe: function () {
    return Person.prototype.describe.call(this) + "(" + this.title + ")";
  }
};

みたいに書いていたのが、

function Person (name) {
  this.name = name;
}
Person.prototype = {
  describe() {
    return "Person called " + this.name;
  }
}

Person <| function Employee (name, title) {
  super(name);
  this.title = title;
}
Emmployee.prototype = {
  describe() {
    return super.describe() + "(" + this.title + ")";
  }
};

とできるようになる....のかな?

superの扱いがイマイチ微妙。

ちょいと書き方がキモイけど、これでクラス厨も黙るはずですね!