Verwendung der Funktion als Prototyp

8

Unter Verwendung von JavaScript ist es zulässig, eine Funktion als Prototyp zu verwenden, z. B.

%Vor%

oder muss

verwendet werden? %Vor%

und noch wichtiger, macht es einen wichtigen Unterschied?

    
Alexander Mills 24.05.2015, 04:58
quelle

2 Antworten

6

Ja, beide Wege sind wegen der Flexibilität der prototypischen JavaScript-Vererbung zulässig. Betrachten wir zunächst die prototypische Kette für beide Fälle. Ich betrachte nur buchstäbliche Objekte für die Einfachheit.

Object.prototype vs. Funktionsprototyp

Der letzte Wert von __proto__ (intern [[Prototype]] ) für die Objekte, die mit Literal erstellt wurden, ist Object.prototype . Zum Beispiel:

%Vor%

Bei Funktionen ist der letzte Wert von __proto__ ebenfalls Object.prototype , außer dass er immer einen vorhergehenden Wert Function.prototype hat. Zum Beispiel:

%Vor%

Für Option 1:

%Vor%

Wie oben erwähnt, ist die prototypische Kette Foo -> Function.prototype -> Object.prototype

Für Option 2:

%Vor%

und die prototypische Kette wird Foo -> Object.prototype

sein

In beiden Fällen ist die prototypische Kette gültig und die Vererbung funktioniert einwandfrei.

    
Samir 24.05.2015, 06:01
quelle
3

Jedes Objekt kann ein Prototyp sein. Der Prototyp kann ein einfaches altes Objekt oder eine Funktion oder ein Array sein, bei denen es sich um Objekte oder alles andere, einschließlich Objekte, handelt, einschließlich Regexps und sogar Datumsangaben, ganz zu schweigen von Objekten, die Grundelemente wie Zahlen und Strings und Boolesche Elemente umschließen / p>

Aber wenn Leute über die Verwendung von, sagen wir, eine Funktion als Prototyp sprechen, haben sie normalerweise die Absicht oder hoffen, dass sie auf diese Funktion vom instanziierten Objekt zugreifen können, aber sie können 't . Instanzen suchen Eigenschaften nach dem Prototyp, sei es ein Array oder ein Date oder eine Regexp oder eine Funktion oder ein einfaches altes Objekt, aber sie können nicht auf den "Körper" des Prototypobjekts zugreifen, die Sache, die im Fall von Objekten, die auf Zahlen oder Strings basieren, PrimitiveValue heißt.

Hier sind einige Beispiele, die das verdeutlichen könnten, indem wir den einfachsten Fall des Erzeugens eines Objekts basierend auf einem Prototyp mit Object.create verwenden.

%Vor%

Betrachten wir nun den Fall der Funktion als Prototyp. Wie bei den anderen Objekttypen

%Vor%

Da fn jedoch einen eigenen Prototyp hat, einschließlich Methoden wie call , übernimmt auch obj diese. Also obj.call ist definiert. Der Aufruf führt jedoch zu einem Fehler, da obj keine Funktion ist, die aufgerufen werden kann.

%Vor%

Die Schlussfolgerung ist also, dass nichts besonders falsch oder illegal ist, wenn man eine Funktion als Prototyp verwendet; Es gibt einfach keinen Grund dazu.

    
user663031 24.05.2015 16:41
quelle

Tags und Links