2017-01-12 3 views
0

内で使用することができないコードであるなぜ静的メソッドがインスタンスメソッドやコンストラクタここ

Uncaught TypeError: (intermediate value).m is not a function 

I親を使用しようとすると、このタイプのエラーが生成されインスタンスメソッドまたはコンストラクタのクラス静的メソッド。どうして?私が理解したよう

superFooを参照し、[OK]を次のような作品:

class Bar extends Foo { 
    b() { 
     Foo.m(); 
    } 
} 
+0

'ので、 ? 'Foo.m();' – Igor

+0

@Igor、私の更新をご覧ください –

+0

@Jonaswあなたはfooの新しいインスタンスを作成しません。インスタンスは1つだけです( 'this')。 – estus

答えて

4

superためのプロパティはインスタンスメソッドでFoo.prototypeプロパティを参照し、superプロパティは静的メソッドでFoo静的プロパティを参照してください。

super(...)コールインコンストラクタは、内部でFoo.call(this, ...)のようなものを実行します。

super単独では意味がなく、通常の変数として使用することはできません。

それは次のようになります。

b() { 
    this.constructor.m(); 
} 

BarFooからm静的メソッドを継承するため。

それともそれが特異的親クラスである必要がある場合は、

b() { 
    super.constructor.m(); 
} 
+0

_ superはインスタンスmethods_の親クラスのプロトタイプを参照していますから - それは 'constructor'と' instance methods'の異なるものを参照していますか?もしそうなら、それは 'コンストラクタ'で何を参照していますか? –

+0

'super(...)'は特別な意味を持ち、コンストラクタでのみ使用できます。 'super'プロパティはインスタンスメソッドの' Foo.prototype'プロパティと静的メソッドの 'Foo'プロパティです。私は 'super === super.constructor'と言うでしょうが、' super'は単独では使用できません。 – estus

+0

ありがとう、この情報を回答に追加してください、それは私の質問に答える鍵です。また、明確にするために、呼び出し元演算子を持たない 'super'はコンストラクタで意味を持たないのですか?呼び出さずに使用するかのように、Uncaught SyntaxError: 'ここで予期せぬスーパーキーワード'エラーが発生する場合があります。 –

0

Fooのインスタンスを検討してみます。 mFooインスタンスの正式なメンバーではありませんが、公開された静的メソッドとしてconstructorの下に「フック」されています。あなたは、コードが機能するためには

は、ちょうどにBar classbメソッドの定義を変更します。

このトピックの
b() { 
    super.constructor.m(); 
} 

詳細はここで見つけることができます:m`がインスタンスに属していないhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/static

+0

_MはFooインスタンスの正式なメンバーではないことがわかります_それは真実ではありません。私の例は 'Foo.m();' –

+0

@Maximus 'Foo'の例ではありません。 Foo。 'var i = new Foo();'は 'Foo'のインスタンス' i'を作成し、 'i.m()'を呼び出すと 'TypeError:i.mは関数ではありません。 –

関連する問題