[解決済み] ES6でsuperを使用せずにクラスを拡張するには?
質問
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)クラスのルールは、基本的に以下のようになります。
-
子クラスのコンストラクタで
this
が使用できるようになるまでsuper
が呼び出されるまで使用できません。 -
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
がまだ呼び出されていない場合、あるいは明示的な置換オブジェクトが返されていない場合、コンストラクタ呼び出しの最終行で例外がスローされます。
関連
-
[解決済み] 正規表現で変数を使うには?
-
[解決済み] JavaScriptで要素のクラスを変更するにはどうすればよいですか?
-
[解決済み] ページを再読み込みせずにURLを変更するにはどうすればよいですか?
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] 指定された要素にクラスを追加するには?
-
[解決済み] 新しい配列を作成せずに、既存のJavaScript配列を別の配列で拡張する方法
-
[解決済み] C++でクラスと構造体はいつ使い分けるべきか?
-
[解決済み] ES6インポートで中括弧を使用するのはどのような場合ですか?
-
[解決済み] Reactでes6クラスを使うときの「super()」と「super(props)」の違いとは?
-
[解決済み】ES6クラス変数の代替品
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Reactでes6クラスを使うときの「super()」と「super(props)」の違いとは?
-
[解決済み] jQueryの$という記号の意味は何ですか?
-
[解決済み] JavaScript のオブジェクトの配列を比較し、最小値/最大値を取得する
-
[解決済み] BlobからArrayBufferへ移行する方法
-
[解決済み] TypeScriptプロジェクトで既存のC#クラス定義を再利用する方法
-
[解決済み] ECMAScriptとは?
-
[解決済み] JavaScriptでjson-objectのキーを取得する [重複].
-
[解決済み] Javascript の parseInt() で先頭のゼロを削除する。
-
[解決済み] <ng-content>が空かどうかを確認する方法は?(これまでのAngular 2+で)
-
[解決済み] 変異を伴わないオブジェクトからの値の削除