2017-12-06 14 views
1

super()が呼び出されるまで「this」というキーワードが「未定義」であることがわかりました。私は自分自身で(将来的に)これらの回答をどこで調べることができるかを学ぶことだけを求めています。この動作を示しJavascript super()が呼び出されるまでサブクラスで「this」が定義されていない理由

コードを以下に与えられる:

class BaseClass { 
 
    constructor(){ 
 
     this.baseVar = 1; 
 
    } 
 
} 
 

 
class SubClass extends BaseClass { 
 
    constructor(...args){ 
 
     try { 
 
      console.log('this BEFORE calling super. this:', this); 
 
     } catch(ex) { 
 
      console.log('this BEFORE calling super. this: caused exception!'); 
 
     } 
 
     super(...args); 
 
     this.subVar = 2; 
 
     console.log('this AFTER calling super. this:', this); 
 
    } 
 
} 
 

 
var base = new BaseClass(); 
 
var subclass = new SubClass();

これからの出力は、以下に示す:

this BEFORE calling super. this: caused exception! 
this AFTER calling super. this: SubClass { baseVar: 1, subVar: 2 } 
+0

例外により、メッセージが表示されます。なぜそれを捕まえて無視しているのですか? –

+0

文書化されている場所は、言語全体が文書化されているのと同じ場所にあります...言語仕様。 –

+1

*なぜ*それが許可されていないかについてのより良い説明については、以下を参照してください。[Uncaught ReferenceError:これはクラスコンストラクタでは定義されていません](https://stackoverflow.com/questions/32516204/uncaught-referenceerror-this-is -not-defined-in-class-constructor) – JCOC611

答えて

2

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/super

When used in a constructor, the super keyword appears alone and must be used before the this keyword is used. The super keyword can also be used to call functions on a parent object.

ページで提供されている例は、あなたが言及した行動を展示:

class Square extends Polygon { 
    constructor(length) { 
    this.height; // ReferenceError, super needs to be called first! 

    // Here, it calls the parent class' constructor with lengths 
    // provided for the Polygon's width and height 
    super(length, length); 

    // Note: In derived classes, super() must be called before you 
    // can use 'this'. Leaving this out will cause a reference error. 
    this.name = 'Square'; 
    } 

    get area() { 
    return this.height * this.width; 
    } 

    set area(value) { 
    this.height = this.width = Math.sqrt(value); 
    } 
} 
0

のJavaScriptの最大の問題は、現在、多くのものが動的であり、あなたは基本的にどのようにの中核となる概念を変えることができるようデバッグが他の言語に比べて困難であるということです言語は機能します。 ES6の主な目的は、共通の動的な問題と言語の誤解を取り除くことでした。プロトタイプの継承は、いくつかのケースでは本当に便利ですが、言語アーキテクトは継承を作成する上でより読みやすく、より安定した方法(Javaの方にとってもっと有名です)の必要性を認識しました。それで彼らがclassを導入した理由と、super()を呼び出す前にthisと一緒に作業することができないことが、より安定したものの1つです。

関連する問題