Referenztyp
Die Referenztypen enthalten hauptsächlich: Objekttyp, Array -Typ, Datumstyp, Regexp -Typ, Funktionstyp usw.
Wenn Referenztypen verwendet werden, muss ein Objekt (Instanz) aus ihnen generiert werden. Mit anderen Worten, ein Referenztyp entspricht einer Vorlage. Wenn wir einen bestimmten Referenztyp verwenden möchten, müssen wir diese Vorlage verwenden, um ein Objekt zur Verwendung zu generieren, sodass der Referenztyp manchmal als Objektdefinition bezeichnet wird.
Zum Beispiel müssen wir ein Personenobjekt generieren, um die persönlichen Informationen und das Verhalten einer Person zu definieren. Daher müssen wir uns auf den Objekttyp verlassen:
var person = new Object (); Person.name = "JiangShui"; Person.sayname = function () {console.log (this.name);}Das obige Personenobjekt wird durch die "Vorlage" mit dem neuen Bediener unter Verwendung des Objekttyps definiert. Danach können Sie diesem Objekt den Attributnamen und die Methode SayName hinzufügen. Eigenschaften und Methoden sind "Funktionen" von Objekttypen, sodass Objekte, die über Referenztypen wie Objekt erstellt wurden, verwendet werden können.
Das Erstellen eines Objekts erfordert nicht unbedingt die Verwendung des neuen Bedieners. Es gibt einige Typen, die beim Erstellen vereinfacht werden können. Zum Beispiel können Sie auch die folgenden zwei Methoden verwenden:
var person = {}; Person.name = "jiangshui"; person.sayname = function () {console.log (this.name);}oder
var person = {name: "jiangshui", sayName: function () {console.log (this.name); }};Die Funktion des {} -Operators entspricht dem neuen Object () und vereinfacht die Operationen. Es gibt einige Unterschiede in den beiden oben genannten Schreibmethoden. Das erste ist "anhängen", dh in der vorherigen Definition fügen weiterhin Attribute oder Methoden hinzu. Wenn die gleichnamige Attributmethode bereits zuvor vorhanden ist, wird sie überschrieben. Der zweite Typ ist "Ersatz", was bedeutet, dass diese Methode unabhängig davon, ob die Eigenschaften und Methoden des Personobjekts zuvor definiert sind, den zuvor definierten Inhalt durch den neu definierten Inhalt ersetzt. Da das vom Referenztyp generierte Objekt eine im Speicher gespeicherte Region ist und sein Zeiger in einer bestimmten Variablen (Person) gespeichert wird, besteht die zweite Art des Schreibens darin, ein neues Objekt (neuer Speicherbereich) zu generieren und dann die Person Variable auf den neuen Speicherbereich zu richten, sodass der vorherige ersetzt wird. Das zu verstehen ist für das spätere Verständnis von entscheidender Bedeutung.
Die Verwendung anderer Referenztypen ist ungefähr gleich, wie z. B. der Array -Typ, mit dem auch Objekte erzeugt oder direkt definiert werden können. Nachdem Sie ein Array -Objekt generiert haben, können Sie die Informationsinhalte im Format des Arrays speichern. Darüber hinaus wird das Objekt die im Array -Typ definierten Methoden wie Push, Verschiebung, Sortier usw. definiert, und Sie können diese Methoden aufrufen, z. B.:
var colors = []; farben.push ('rot', 'grün'); console.log (farben);Der obige Code erstellt ein Array-Objekt über den Array-Typ, ruft dann die zuvor im Array-Typ definierte Push-Methode auf, fügt dem Objekt zwei Werte rot und grün hinzu und druckt ihn schließlich auf der Konsole aus und Sie können ihn sehen.
Methoden anrufen und anwenden
Diese beiden Methoden werden vom Funktionstyp bereitgestellt, was bedeutet, dass sie bei Funktionen verwendet werden können. Die Funktion des Aufrufs entspricht der Anwendenmethode, bei der der Funktionsbereich des Funktionsbereichs erweitert wird. Der Unterschied besteht darin, dass bei Verwendung des Anrufs die an die Funktion übergebenen Parameter einzeln aufgeführt werden müssen, die Antragsmethode verwendet sie jedoch nicht. Auf diese Weise können Sie sich entscheiden, Anrufe zu verwenden oder nach den Anforderungen Ihrer eigenen Funktion zu bewerben.
Was bedeutet der Umfang der Expansionsfunktionsoperation? Sie werden verstehen, indem Sie ein Beispiel geben.
Sie können diese Weise verstehen, dass die Funktion in einen Container (Geltungsbereich) eingewickelt ist, und es gibt einige Variablen oder andere Dinge in diesem Container. Wenn die Funktion ausgeführt wird, werden diese Variablen usw. aufgerufen. Sie finden dieses Ding im aktuellen Container. Dieser Behälter wickelt tatsächlich einen größeren Behälter nach draußen. Wenn der aktuelle kleine Container es nicht hat, sucht die Funktion im größeren Container usw. und findet das größte Containerfensterobjekt. Wenn die Funktion jedoch im aktuellen kleinen Container ausgeführt wird, gibt es entsprechende Variablen usw. im kleinen Behälter, selbst im großen Container, nennt die Funktion sie immer noch in seinem eigenen Behälter.
Die Aufruf- und Anwendungsmethoden sollen dieses Problem lösen und die Einschränkungen von Containern durchbrechen. Wie für das vorherige Beispiel:
var person = {name: "jiangshui", sayName: function () {console.log (this.name); }};Nach dem Öffnen der Chromkonsole fügen Sie sie ein und führen Sie sie aus und führen Sie dann Person aus.
Zu diesem Zeitpunkt ist Person ein Container, der eine SayName -Methode (Funktion) erstellt. Bei der Ausführung muss es unter dem Umfang der Person ausgeführt werden. Wenn sie direkt unten ausgeführt werden, dh die Ausführung im Fensterbereich führt zu einem Fehler, der nicht definiert ist, da die SayName -Methode unter dem Fenster nicht definiert ist. Der Zeiger im Inneren ist eine besondere Sache, die auf den aktuellen Bereich hinweist. Die Bedeutung dieses. NAME ist, den Namenswert unter dem aktuellen Bereich aufzurufen.
Als nächstes fügen wir dem Fensterobjekt ein Namensattribut hinzu:
window.name = "yujiangshui";
Oder direkt
name = "yujiangshui";
Da das Fenster der größte Behälter ist, kann das Fenster weggelassen werden. Alle definierten Attribute oder Variablen sind an das Fenster angeschlossen. Wenn Sie es nicht glauben, können Sie sehen:
Jetzt möchten wir die SayName -Methode im kleinen Behälter unter dem großen Fensterbehälter ausführen. Wir müssen den Anruf verwenden oder bewerben, um den Umfang der SayName -Methode zu erweitern. Führen Sie die folgende Anweisung aus:
Person.sayname.call (Fenster);
oder
Person.sayname.call (this);
Die Ausgangsergebnisse sind gleich. Sie können auch anwenden verwenden, um den Effekt anzuzeigen, da diese Demo zu einfach ist und keine Übergabe von Parametern erfordert.
Lassen Sie mich den obigen Code erklären. SayName ist zunächst eine Instanz des Funktionstyps, der die Aufrufmethode und die Anwendenmethode enthält. Da die Anruf- und Anwendungsmethoden Funktionsmethoden sind, müssen wir Person.SayName.call (Fenster) auf diese Weise anstelle von Person.sayName () aufrufen. Anruf (Fenster) und so weiter.
Anschließend sind die Parameter der Aufruf- und Anwendungsmethoden ein Umfang (Objekt), was darauf hinweist, dass die vorherige Funktion unter dem übergebenen Bereich ausgeführt wird. Nachdem das Fensterobjekt in die SayName -Methode übergeben wird, verweist in der SayName -Methode auf das Fenster. NAME, sodass das Zielfernrohr erweitert wird.
Warum hat das Fenster vorbei und dies hat den gleichen Effekt? Da der aktuelle Speicherort der Ausführung dieser Funktion das Fenster ist, wie bereits erwähnt, zeigt dieser Zeiger auf den aktuellen Bereich, sodass dieser Zeiger auf das Fenster verweist, sodass er dem Fenster gleich ist.