Die Antwort auf diese Frage: Was ist der Anfangswert des Prototyps einer JavaScript-Funktion? Eigentum?
hat diesen Satz:
Der Anfangswert des Prototyps für eine neu erstellte Function-Instanz ist eine neue Instanz von Object
Soweit ich weiß, hat Javascript keine Klassen und das Wort "Instanz" macht in meinem Kopf keinen Sinn. Wie soll man 'Instanz' in Javascript interpretieren?
Tut mir leid, ich habe nicht genug Rep, um meine Frage in den Kommentarthread dieser Antwort einzutragen.
Sie haben recht, dass JavaScript (noch) keine Klassen hat, aber Konstruktorfunktionen, einen instanceof
-Operator, der eine Beziehung zwischen Objekten und Konstruktoren definiert, und eine Form der Vererbung basierend auf Prototypketten / p>
obj instanceof ctor
ist wahr, wenn ctor.prototype
auf der Prototypkette von obj
steht.
Modulo die Einschränkung unten, könnten Sie instanceof
in EcmaScript 5 so implementieren
Wenn Sie keine neuen Prototypen zuweisen ( o = new MyConstructor(); MyConstructor.prototype = somethingElse
), sollte new MyConstructor() instanceof MyConstructor
sein.
Abschnitt 15.3.5.3 erklärt dies im Detail.
15.3.5.3
[[HasInstance]] (V)
Angenommen, F ist ein Function-Objekt.
Wenn die interne Methode [[HasInstance]] von F mit dem Wert V aufgerufen wird, werden die folgenden Schritte ausgeführt:
- Wenn V kein Objekt ist, gebe false zurück.
- Sei O das Ergebnis des Aufrufs der internen Methode [[Get]] von F mit dem Property-Namen "prototype".
- Wenn Type (O) kein Objekt ist, wird eine TypeError-Ausnahme ausgelöst.
Wiederholen
- Sei V der Wert der internen [[Prototyp]] - Eigenschaft von V.
- Wenn V null ist, gebe false zurück.
- Wenn sich O und V auf dasselbe Objekt beziehen, geben Sie true zurück.
Dies ist nicht die ganze Geschichte, da Host-Objekte (wie DOM-Knoten) die interne [[HasInstance]]
-Methode beliebig implementieren können, aber die meisten Browser implementieren Host-Objekte so, dass sie sich möglichst wie native Objekte verhalten.
In JS ist eine Funktion ein Objekt. Es dauert eine Weile, sich daran zu gewöhnen, aber es ist wahr. Wirf das ein bisschen herum und der Code, den du siehst, macht mehr Sinn. Wenn Sie JavaScript gesehen haben, wo Leute eine Funktion () {} als Parameter an eine andere Funktion übergeben, ist das ein Beweis, dass Funktionen erstklassige Objekte sind.
Sobald Sie Ihren Kopf darum wickeln können (es dauerte eine Weile), dann müssen Sie verstehen, dass Sie eine neue Instanz davon erhalten können, wenn Sie eine Funktion erstellen. Siehe den folgenden Code:
%Vor%An dieser Stelle haben Sie zwei Instanzen der FooName-Methode: n1 und n2. Es ist eine Art Konvention in JS, Ihre instanziierbare Funktion mit einem Großbuchstabe ersten Buchstaben anstelle des Kleinbuchstabens des ersten Großbuchstabens zu bezeichnen. In diesem Beispiel zeige ich an, dass meine Funktion instanziert werden kann, indem sie FooName anstelle von fooName benannt wird. Ich hoffe das macht Sinn.
Im obigen Beispiel hat n1 drei Eigenschaften. Eine private name-Eigenschaft, eine öffentliche setName-Eigenschaft und eine öffentliche getName-Eigenschaft. Jedes Mal, wenn ich einen neuen FooName instanziiere, wird eine Kopie von getName und setName erstellt. Das kann Speicherplatz im Speicher verschwenden. Da sich getName und setName nicht ändern werden, brauche ich für jede FooName-Instanz keine neue Kopie davon. Hier kommen Prototypen ins Spiel.
Sie können Folgendes sagen, und dann werden getName und setName nur einmal im Speicher vorhanden sein, wodurch Speicher frei wird, was eine gute Sache ist.
%Vor%Wenn Sie den getName und den setName aus der FooName-Funktion entfernen, haben Sie jetzt eine FooName- "Klasse" mit zwei Methoden, getName und setName.
Spiel damit. Lass es mich wissen, falls du fragen hast.
Javascript verwendet keine klassische Vererbung, es verwendet prototypische Vererbung wo alles ein "Objekt" und Vererbung ist wird durch Klonen erreicht, zum Beispiel:
%Vor% hier myInstance
kann als "Instanz von" myPrototype
bezeichnet werden, aber in Wirklichkeit geschah das mit dem new
Schlüsselwort, das du geklont hast myPrototype
, um myInstance
zu erstellen.
Tags und Links javascript function object instance