2017-01-12 3 views
0

Hier verwendet wird, ist der Code:Warum statische Methoden können nicht in Instanzmethoden oder Konstruktor

class Foo { 
    static m() { 
     console.log('m'); 
    } 
} 
class Bar extends Foo { 
    b() { 
     super.m(); 
    } 
} 

var b = new Bar(); 
b.b(); 

, die wirft:

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

Diese Art von Fehler wird generiert, wenn ich Eltern zu verwenden versuchen, statische Klassenmethoden in einer Instanzmethode oder einem Konstruktor. Warum?

Wie ich verstehe, bezieht sich super auf die Foo und die folgenden Werke OK:

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

weil 'm' nicht zu einer Instanz gehören:

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

Mehr zu diesem Thema finden Sie hier ? 'Foo.m();' – Igor

+0

@Igor, siehe mein Update –

+0

@Jonasw Sie erstellen keine neue Instanz von foo. Es gibt nur eine Instanz ('this'). – estus

Antwort

4

Da super Eigenschaften Foo.prototype Eigenschaften in Instanzmethoden beziehen und super Eigenschaften beziehen sich auf Foo statischen Eigenschaften in statischen Methoden.

super(...) Aufruf in Konstruktor hat eine besondere Bedeutung und macht so etwas wie Foo.call(this, ...) intern.

super allein hat keine Bedeutung und kann nicht als reguläre Variable verwendet werden.

es sein sollte:

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

weil Bar inherits m statische Methode von Foo.

Oder wenn es sollte speziell Elternklasse sein,

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

_Weil super sich auf den Prototyp der Elternklasse in der Instanz methods_ bezieht - bezieht es sich also auf andere Dinge in 'Konstruktor' und' Instanzmethoden'? Wenn ja, worauf bezieht es sich in einem Konstruktor? –

+0

'super (...)' hat eine besondere Bedeutung und kann nur im Konstruktor verwendet werden. "Super" -Eigenschaften sind 'Foo.prototype'-Eigenschaften in Instanzmethoden und' Foo'-Eigenschaften in statischen Methoden. Ich würde sagen "super === super.constructor", aber "super" kann nicht alleine verwendet werden. – estus

+0

danke, können Sie bitte diese Informationen zu der Antwort hinzufügen, das ist der Schlüssel zur Beantwortung meiner Frage. Um zu verdeutlichen, hat "Super" ohne Aufrufoperator in einem Konstruktor keine Bedeutung? Es scheint der Fall zu sein, als ob ich es ohne Aufruf verwende Ich bekomme das "Uncaught SyntaxError: 'super' Schlüsselwort unerwartet hier" Fehler –

0

versuchen, eine Instanz von Foo zu untersuchen. Sie werden sehen, dass m kein reguläres Mitglied der Foo Instanz ist, aber es ist unter der constructor als eine öffentliche statische Methode "süchtig".

Für Sie Code zu arbeiten, ändern Sie einfach die b Methodendefinition auf Bar class zu: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/static

+0

_Sie werden sehen, dass m kein reguläres Mitglied der Foo instance_ ist - das ist nicht wahr, siehe mein Beispiel mit 'Foo.m();' –

+0

@Maximus 'Foo' in keiner Instanz von Foo. 'var i = new Foo();' erstellt eine Instanz 'i' von' Foo' und wenn Sie versuchen, 'i.m()' aufzurufen, erhalten Sie 'TypeError: i.m ist keine Funktion' –

Verwandte Themen