ちょっとハマったのでメモ。 例えば
alert(A); function A() { }
はできるが、
alert(A); class A { }
ができないのはなぜか。
class A { } class B extends A { }
例えば、このようなコードの場合、hoisting(スコープ先端への巻き上げ)をしても問題ないが、 関数と違ってextendsはその場で評価しなければいけないことがある。 例えば、
var A = function () { }; A.prototype.x = function () { return 1; }; class B extends A { } alert(new B().x());
というコードの場合、BクラスはAを継承しなければいけないので、var Aで宣言されているものはhoistingされないのでclass宣言もその場で評価しないと、正常に継承することができない。
というわけで、
function A () { }
と
class A { }
は評価の順序が違い、class Aはvar A =とおなじような順序で評価されるわけである。