1. ホーム
  2. javascript

[解決済み] ES6でsuperを使用せずにクラスを拡張するには?

2022-08-25 11:03:58

質問

ES6 で、クラスを拡張する際に super メソッドを呼び出すことなくクラスを拡張することはできますか?

EDIT: 質問は誤解を招くかもしれません。を呼び出すのが標準なのでしょうか? super() なのか、それとも私が見逃しているのか?

例えば

class Character {
   constructor(){
      console.log('invoke character');
   }
}

class Hero extends Character{
  constructor(){
      super(); // exception thrown here when not called
      console.log('invoke hero');
  }
}

var hero = new Hero();

を呼んでいないときは super() を呼んでいない場合は、スコープの問題が発生します。 this is not defined

v2.3.0でiojs --harmonyで動かしています。

どのように解決するのですか?

ES2015(ES6)クラスのルールは、基本的に以下のようになります。

  1. 子クラスのコンストラクタで this が使用できるようになるまで super が呼び出されるまで使用できません。
  2. ES6 クラスのコンストラクタは、必ず super を呼び出すか、初期化されなかったオブジェクトの代わりとなるオブジェクトを明示的に返さなければなりません。

これは ES2015 仕様の 2 つの重要なセクションに帰結します。

セクション 8.1.1.3.4 を決定するためのロジックを定義しています。 this が関数内にあるかどうかを決定するロジックを定義します。クラスにとって重要なのは、関数内で this の中にあることです。 "uninitialized" の状態であり、この状態のときに this を使おうとすると例外が投げられます。

セクション 9.2.2 , [[Construct]] を介して呼び出される関数の動作を定義しています。 new または super . ベースクラスのコンストラクタを呼び出す場合。 this のステップ#8で初期化されます。 [[Construct]] で初期化されますが、それ以外の場合は this は初期化されない。構築の終わりには GetThisBinding が呼ばれるので、もし super がまだ呼び出されていない場合 (つまり this がまだ呼び出されていない場合、あるいは明示的な置換オブジェクトが返されていない場合、コンストラクタ呼び出しの最終行で例外がスローされます。