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の扱いがイマイチ微妙。
ちょいと書き方がキモイけど、これでクラス厨も黙るはずですね!