2015-09-11 61 views
36

JavaScript/ES6で新しいものを試しています。私はUncaught ReferenceError: this is not defined(...) player.js:5を私のコードに入れます。私が見る限り、ここにはエラーはありません!これはバグですか?回避策はありますか?クラスコンストラクタで "Uncaught ReferenceError:これは定義されていません"

index.htmlを

<html> 
    <head> 
     <script type="text/javascript" src="js/entity.js"></script> 
     <script type="text/javascript" src="js/player.js"></script> 
     <link href="css/style.css" rel="stylesheet" type="text/css"> 
     <title>Test</title> 
    </head> 
    <body> 
     <canvas id="screen" width=500 height=500></canvas> 
     <script type="text/javascript">initialize();</script> 
    </body> 
</html> 

entity.js

"use strict"; 

class Entity { 
    constructor() { 
     console.log("Entity"); 
    } 
} 

player.js

"use strict"; 

class Player extends Entity { 
    constructor() { 
     console.log("Created"); // <- error here 
    } 
} 
+1

何か不足していますか、どこでも 'initialize'を宣言していませんか? – Bergi

+0

それは私の間違いで残っていた、古い無関係なコードでした。 – bshaw

+1

[Javascript ES6クラスはスーパーなしで拡張可能]の重複の可能性があります(http://stackoverflow.com/questions/31067368/javascript-es6-class-extend-without-super) – Makyen

答えて

61

これは、新しいクラス構文の事実です。クラスを適切に初期化するには、サブクラスがsuper()に電話する必要があります。

super(arg1, arg2, argN); 

親コンストラクタが必要とする引数を指定します。

実行がconstructor機能の終わりに達した場合、thisの値が何かに初期化されている必要がある、ということが必要です。基本クラス(thisが自動初期化されている)にあるか、super()と呼び、thisが初期化されているか、代替オブジェクトreturnが呼び出されている必要があります。

class Player extends Entity { 
    constructor() { 
    super(); 
    console.log("Created"); ;// error here 
    } 
} 

あなたは一種の彼らの最後に自動return thisを持ってconstructor関数のように考えることができます。

関連する問題