2016-11-14 8 views
1

を呼び出すことができ、「スーパー」などの基本クラスを呼び出すことができます。「スーパー」がES6で、基本クラスのメソッドとプロパティ

class A{ 
    constructor(){ 
    this.p = 2; 
    } 
    initF(){ 
    return this.p 
    } 
} 

class B extends A{ 
    constructor(){ 
    super(); 
    console.log(super.p); // undefined 
    console.log(super.initF()); // 2 
    } 
    ff(){ 
    console.log(super.initF()); // 2 
    } 
} 

new B().ff(); 

我々だけで、基本クラス(A)メソッドを呼び出すことができることは明らかであり、プロトタイプを呼び出すことはできません。なぜスーパークラスで基本クラスのプロトタイプにアクセスできないのですか?

+1

派生クラスの基底クラスでsuper()constructor

を呼び出した後、すべてのプロパティを取得することができますあなたはすべてのプロパティにアクセスするために 'this'を使用することができます基本クラス。 console.log(this.p); –

+0

_ "なぜスーパークラスでプロトタイプにアクセスできないのですか" _実際には、これはあなたの例で行います。 – zeroflagL

答えて

1

実際に可能です。

質問に答えてください:JavaScriptはプロトタイプチェーンに継承されたプロパティを入れません。あなたが望むのであれば、あなた自身で設定する必要があります:A.prototype.p = 5

あなたが別のクラスから継承すると、あなたのメソッドはプロトタイプに置かれ、それらはクラス間で共有され、ベースクラスのメソッドを上書きすることができます。それは良い。 this.p代わりのsuper.p:あなたが継承している場合

は今、あなたはその後、基底クラスのコンストラクタが呼び出され、あなたがプロパティにアクセスすることができ​​ を呼び出す必要があります。そのため、継承されたすべての(次の)継承クラスのプロパティ(プロトタイプ内)を変更することになりますが、それは私たちが望むものではありません。独自のプロパティを継承するクラスごとにこれを必要とします。

多分あなたはTypeScriptを見てください。より多くの構文的な砂糖で書くことができます。

class A { 
 
    constructor(){ 
 
    this.p = 2; 
 
    } 
 
    initF(){ 
 
    return this.p 
 
    } 
 
} 
 

 
class B extends A { 
 
    constructor(){ 
 
    super(); 
 
    console.log("super.constructor.prototype: ", super.constructor.prototype); 
 
    console.log("super.constructor.prototype.p: ", super.constructor.prototype.p); 
 
    console.log('A.prototype.p', A.prototype.p); 
 
    console.log('this.__proto__.', this.__proto__.p); 
 
    console.log('super.p', super.p); 
 
    console.log(super.initF()); 
 
    } 
 
    ff(){ 
 
    console.log(super.initF()); 
 
    } 
 
} 
 

 
class C extends B { 
 
    constructor() { 
 
    super(); 
 
    } 
 
} 
 

 
new B().ff(); 
 

 
A.prototype.p = 10; 
 

 
new C().ff();

1

superキーワードは、オブジェクトの親に関数を呼び出すために使用されます。

super.propとsuper [expr]式は、クラスとオブジェクトリテラルの両方のメソッド の定義で有効です。

あなたはthisを使用して、親のプロパティにアクセスするだけで、より読みhere

class A{ 
 
    constructor(){ 
 
    this.p = 2; 
 
    } 
 
    initF(){ 
 
    return this.p 
 
    } 
 
} 
 

 
class B extends A{ 
 
    constructor(){ 
 
    super(); 
 
    console.log(super.p); // invalid = undefined 
 
    console.log(super().p); // valid = 2 
 
    console.log(super.initF()); // 2 
 
    } 
 
    ff(){ 
 
    console.log(super.initF()); // 2 
 
    } 
 
} 
 
new B().ff();

関連する問題