Was bedeutet "eine Instanz von" in Javascript?

8

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.

    
loldrup 09.08.2011, 20:25
quelle

7 Antworten

16

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

%Vor%

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:

     
  1. Wenn V kein Objekt ist, gebe false zurück.
  2.   
  3. Sei O das Ergebnis des Aufrufs der internen Methode [[Get]] von F mit dem Property-Namen "prototype".
  4.   
  5. Wenn Type (O) kein Objekt ist, wird eine TypeError-Ausnahme ausgelöst.
  6.   
  7. Wiederholen

         
    1. Sei V der Wert der internen [[Prototyp]] - Eigenschaft von V.
    2.   
    3. Wenn V null ist, gebe false zurück.
    4.   
    5. Wenn sich O und V auf dasselbe Objekt beziehen, geben Sie true zurück.
    6.   
  8.   

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.

    
Mike Samuel 09.08.2011, 20:30
quelle
5

JavaScript hat keine Klassen, aber es gibt Typen. Sie können Ihren eigenen Typ definieren und eine neue Instanz mit dem Schlüsselwort new erstellen:

%Vor%     
gilly3 09.08.2011 20:36
quelle
3

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.

    
frosty 09.08.2011 20:49
quelle
1

In JavaScript-Funktionen sind erstklassige Objekte, dh Sie können sie wie jedes Objekt behandeln.

// Klasse definieren

%Vor%

// Unmengen erstellen

%Vor%

Ссылка

Ссылка

    
Praveen Prasad 09.08.2011 20:36
quelle
1

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.

    
nwellcome 09.08.2011 20:40
quelle
0

So, jetzt habe ich eine Seite erfunden, die beschreibt, was ich glaube, sagt ihr alle: Ссылка

illustriert mit schönen Grafiken:)

Grüße Jon

* und dieser Link: Ссылка

    
loldrup 10.08.2011 11:28
quelle
-2

Javascript ist objektorientiert, also hat es Klassen. Es gibt einfach keine explizite "Klassen" -Richtlinie wie in anderen OOP-Sprachen.

    
Marc B 09.08.2011 20:31
quelle