Um JavaScript -Objekte zu verstehen, können wir von der Erstellung von Objekten, Eigenschaften und Objektmethoden beginnen. Zusammenfassend umfasst es die folgenden Module:
1. Erstellen Sie ein Objekt
1.1 Messung der direkten Objekte
Die direkte Menge eines Objekts ist der einfachste Weg, um ein Objekt zu erstellen, und besteht aus mehreren Namen/Wertpaaren:
var point = {x: 0, y: 0};Es gibt keine Begrenzung für Attributnamen. Sie können JS -Schlüsselwörter oder Saiten sein. Wenn diese beiden Situationen, müssen die Attribute in doppelten Zitaten eingeschlossen sein:
var leer = {}; va point = {x: 0, y: 0}; var book = {"Haupttitel": "JavaScript", "Untertitel": "Die definitive Anleitung", "für": "All-Publikum", Autor: {FirstName: "Davide", Lastname: "Flanagan"}};Es ist sehr einfach, Objekte direkt zu erstellen, aber es wird im Allgemeinen nicht auf diese Weise verwendet. Der Code ist niedrig wiederverwendbar. Wenn Sie das Objekt an anderer Stelle verwenden möchten und die Attributwerte unterschiedlich sind, dann tun Sie dies? Müssen Sie einen anderen Code neu erstellen?
1.2 Erstellen Sie ein Objekt durch neu
Bevor Sie ein Objekt über neu erstellen, müssen Sie zunächst eine Funktion erstellen, und neu behandelt diese Funktion als Konstruktor. Erstellen Sie beispielsweise ein Personobjekt durch neu:
Funktion person () {// Konstruktor} var person = new Person ();Primitive Typen im Kern der JavaScript-Sprache enthalten alle integrierte Konstruktoren:
var a = new array (); var d = new Date (); var r = new regexp ("js");1.3 Objekt.Create ()
Bevor wir die Objektmethode erstellen, möchten wir sehen, was ein Prototyp ist. Jedes JavaScript -Objekt (außer Null) ist einem anderen Objekt zugeordnet. Das "andere" Objekt ist das, was wir einen Prototyp nennen. Jedes Objekt erbt Attribute aus dem Prototyp.
Alle durch Objektdirekten erstellten Objekte haben das gleiche Prototyp -Objektobjekt.Prototyp. Der vom Schlüsselwort NEW und Konstruktor erstellte Objektprototyp ist der Wert der Prototyp -Eigenschaft des Konstruktors. Der Prototyp des über New Array () erstellten Objekts ist Array.Prototyp, und der Prototyp des über New Date () erstellten Objekts ist Datum. Der Prototyp wurde hier eingeführt.
Die Methode von Object.create enthält zwei Parameter. Der erste Parameter ist der Prototyp des Objekts, und der zweite Parameter ist optional, um die Objekteigenschaften zu beschreiben. Es ist einfach zu bedienen. Geben Sie einfach das erforderliche Prototypobjekt ein:
var O1 = Object.create ({x: 1, y: 2}); // Der Prototyp ist Object.PrototypeWenn Sie ein Objekt ohne Prototyp erstellen möchten, können Sie Null als Parameter übergeben. Die auf diese Weise erstellten Objekte erben keine Eigenschaften, und es gibt keine Methode wie das ToString:
var o2 = Object.create (null); // kein Prototyp
Wenn Sie ein normales leeres Objekt erstellen möchten, geben Sie es direkt an Object.Prototypen:
var o3 = Object.create (Object.Prototype);
Wenn es sich um ein benutzerdefiniertes Objekt handelt, ist es das gleiche wie das Erstellen eines leeren Objekts. Übergeben Sie den Objektnamen direkt.Prototyp:
Funktion person () {} var o4 = Object.create (Person.Prototype);2. Attributmanagement
2.1 Abfrage und Einstellungen für Eigenschaften
Die Eigenschaften eines Objekts können durch den Operator des Punktes (.) Oder Quadratklammers ([]) erhalten werden. Wenn Sie Punkte verwenden, um das Attribut zu erhalten, muss der Attributname ein einfacher Indikator sein. Es kann kein reserviertes Wort wie O.For oder O.Class sein.
AR Autor = book.author; // korrekt var name = author.surname; // korrekte var title = book ["Haupttitel"]; // korrekt var className = book.class; //Fehler
Die Syntax des Objekts ["Eigenschaft"] sieht eher wie ein Array aus, außer dass die Elemente dieses Arrays eher durch Zeichenfolgen als durch Zahlen indiziert werden. Diese Art von Array nennen wir ein assoziatives Array, das auch als Hash, Karte oder Wörterbuch bezeichnet wird. JavaScript -Objekte sind assoziative Arrays.
Da es sich bei dem Objekt um ein assoziatives Array handelt, bietet uns JavaScript auch eine Methode für/in Traverse -Eigenschaften. Das folgende Beispiel verwendet für/in, um den Gesamtwert des Portfolios zu berechnen:
Funktion GetValue (Portfolio) {var total = 0,0; für (Aktien in Portolio) {var scares = portolio [stock]; var preis = getQuote (savel); Gesamt += Aktien * Preis; } Return Total;}Vererbung: JavaScript -Objekte haben ihre eigenen Eigenschaften, und einige Eigenschaften werden von Prototyp -Objekten vererbt. Schauen wir uns zunächst eine Funktion an, die die Erbschaft implementiert:
Funktion Inherit (p) {if (p == null) typeerror (); // p ist ein Objekt, es kann nicht null sein, wenn (Object.create) {return Object.create (p); // Verwenden Sie das Object.create -Methode direkt} var t = typeof p; if (t! == "Objekt" && t! == "Funktion") typeerror (); Funktion f () {}; F.Prototyp = P; // Setzen Sie sein Prototypattribut auf P zurück.Angenommen, Sie möchten das Attribut x des Objekts o abfragen. Wenn X in O nicht existiert, werden Sie das Attribut X weiter im Prototyp -Objekt von O abfragen. Wenn das Prototyp -Objekt kein X enthält, aber das Prototyp -Objekt auch einen Prototyp hat, führen Sie die Abfrage im Prototyp des Prototyps -Objekts weiter aus, bis x gefunden oder ein Null -Objekt gefunden wird.
var o = {}; // oinherit -Objektattribut ox = 1 aus Object.Prototyp; // X -Attribute für o var p = inherit (o) definieren; // Pinherit O und Object.Prototypep.y = 2; // pDefine Attribut yvar q = inherit (p); // Qinherit P, O und Object.Prototypeq.z = 3; // Attribut definieren zvar s = q.toString (); // Erbringung von Object.Prototypeq.x + qy // => 3: x und y erben von o bzw. p.2.2 Attribute löschen
Der löschende Bediener kann die Eigenschaften des Objekts löschen:
Buch löschen.Author; Buch löschen ["Haupttitel"];
Delete kann nur seine eigenen Attribute löschen und nicht vererbte Attribute löschen. Um eine ererbte Eigenschaft zu löschen, muss sie aus dem Prototyp -Objekt gelöscht werden, das die Eigenschaft definiert, und dies betrifft alle vom Prototyp geerbten Objekte. Die Löschung wird wahr zurückkehren.
ar o = {x: 1}; ox löschen; // x löschen und tregedelete ox zurückgeben; // x existiert nicht mehr, nichts wird getan, zurück. O.ToString löschen; // nichts tu nichts, kehre wahr zurück. Delete kann Attribute nicht mit konfigurierbarem Typ False löschen. Die Eigenschaften einiger integrierter Objekte sind nicht konfigurierbar, wie die Eigenschaften des globalen Objekts, das durch variable Deklarationen und Funktionserklärungen erstellt wurde: Löschen von Objekt.Prototyp // Es kann nicht gelöscht werden. Die Eigenschaften sind nicht konfigurierbar var x = 1; löschen this.x; // Diese Eigenschaft kann nicht gelöscht werden. F () {} löschen this.f; // Die globale Funktion kann nicht gelöscht werden2.3 Eigenschaften erkennen
Um festzustellen, ob eine Eigenschaft in einem Objekt vorhanden ist, kann sie von den Methoden "Operator, HasownProperty () und PropertyISenumerable () festgestellt werden.
In Operator: Der Bediener ist der Eigenschaftsname links und das Objekt rechts. Geben Sie true zurück, wenn das eigene Attribut oder das erbrennende Attribut des Objekts Attribute enthält:
var o = {x: 1}; "x" in o; // true: x ist das Attribut "y" in o; // falsch: y ist nicht das Attribut "tostring" in o; // true: o erbt das toString -AttributHasownProperty () Methode: Erkennt, ob der Vorname die eigene Eigenschaft des Objekts ist. Für das ererbte Attribut wird falsch zurückgegeben:
var o = {x: 1}; o.hasownProperty ("x"); // true: o hat eine kostenlose Eigenschaft xo.hasownProperty ("y"); // false: Keine Eigenschaft yo.hasoenProperty ("tostring"); // Falsch: Das Tostring ist eine VererbungseigenschaftPropertyISenumerable () Methode: Ist eine verbesserte Version von HasownProperty. Es wird nur dann wahr zurückgegeben, wenn das eigene Eigentum erkannt wird und diese Eigenschaft als wahr gehalten wird:
var o = inherit ({y: 2}); ox = 1; o.Propertyisenumerable ("x"); // true: o hat eine aufzählbare Eigenschaft xo.propertyisenumerable ("y"); // false: y ist das ererbte Objekt. // Falsch: Kann nicht aufgezählt werden2.4 Aufzählungseigenschaften
Normalerweise wird für/in verwendet, um die Objekteigenschaften durch Objekteigenschaften zu schleifen, und die durchquerten Eigenschaften umfassen ihre eigenen Eigenschaften und ererbten Eigenschaften. Integrierte Methoden der Objektvererbung sind nicht aufgezählt, aber die Eigenschaften, die Objekten im Code hinzugefügt werden, sind aufgezählt. Zum Beispiel:
var o = {x: 1, y: 2, z: 3}; // Drei aufgezählbare Eigenschaften O.Propertyisenumable ("tostring"); // falsch, kann nicht für (p in o) // übertragungseigenschaftskonsole (p) aufgezählt werden; // Ausgabe x, y und z, kein TastringausgangManchmal wollen wir nur über unsere eigenen Eigenschaften iterieren, und die Eigenschaften sind keine Funktionen:
für (p in o) {if (! o.hasownProperty (p)) weiter; if (typeof o [p] === "Funktion") Fortsetzung;}Wir können die aufzählbaren Attribute durch die Aufzählung von Traversal -Funktion kopieren:
/** Kopieren Sie die aufzählbaren Attribute in p in o und geben Sie O* zurück, wenn O- und P -Attribute gleichnamig enthalten. // Attribute zu O} zurückgeben O;}
ES5 definiert zwei Funktionen, die Attributnamen aufzählen. Das erste ist Object.Keys (), das ein Array zurückgibt, das aus auflistbaren Attributnamen im Objekt besteht. Die zweite Aufzählungsfunktion ist Object.getownPropertynames (), die dem Objekt ähnlich ist.
3. Attributverkapselung
3.1 Attribute Getter und Settertter
Objektattribute bestehen aus Namen, Werten und einer Reihe von Attributen. In ES5 können Attributwerte durch ein oder zwei Methoden ersetzt werden, die Getters und Setter sind. Die von Getters und Setter definierten Attributen werden als "Accessor Attribute" bezeichnet. Im Gegensatz zu "Datenattributen" haben die Datenattribute nur einen einfachen Wert.
Im Gegensatz zu Datenattributen ist das Accessor -Attribut nicht schriftlich. Wenn die Eigenschaft sowohl Getter- als auch Setter -Methoden enthält, handelt es sich um eine Les-/Schreibeigenschaft. Wenn es nur Getter-Methoden hat, handelt es sich um eine schreibgeschützte Eigenschaft, wenn es nur Setter-Methoden hat, dann handelt es sich um eine Nur-Schreib-Eigenschaft. Das Lesen von Schreibattributen gibt immer undefinierte zurück.
Die Syntax der Accessor -Attributdefinition ist ebenfalls relativ einfach. Funktionsdefinition verwendet nicht das Schlüsselwort für Funktion, sondern verwendet GET oder SET:
var o = {// gewöhnliche Datenattribut data_prop: 1, // Accessor -Attribute sind alle paarweise definierten Funktionen ab. Erhalten Sie Accessor_prop () {/* Hier ist die Funktionsbehörde*/}, setzen Sie Accessor_prop (Wert) {}};Denken Sie an das folgende Objekt, das die Koordinaten von 2D -kartesischen Punkten darstellt. Es hat zwei normale Eigenschaften x und y repräsentieren X -Koordinaten bzw. Y -Koordinaten. Es verfügt außerdem über zwei äquivalente Accessor -Eigenschaften, um die polaren Koordinaten von Punkten darzustellen:
var p = {// x und y sind gewöhnliche Read-Write-Datenattribute x: 1.0, y: 1.0, // r ist ein Read-Write-Accessor-Attribut, das Getter und Setter r () {return Math.sqrt (this.x * this.x + this.y * this.y); }, set r (newValue) {var oldValue = math.sqrt (this.x * this.x + this.y * this); VAR -Verhältnis = newValue / oldValue; this.x *= Verhältnis; this.y *= Verhältnis; }. }};Wie bei Datenattributen sind die Accessor -Attribute vererbt, sodass das P -Objekt im obigen Code als Prototyp eines anderen "Punktes" angesehen werden kann. Es kann seine X- und Y -Eigenschaften für ein sexuelles Objekt definieren, aber die R- und Theta -Eigenschaften erben:
var q = inherit (p); qx = 1, qy = 1; console.log (qr); cossole.log (q.theta);
3.2 Attributfunktionen
Wir können die Getter- und Setter -Methoden des Accessor -Attributs als Attributmerkmale betrachten. Nach dieser Logik können wir auch die Eigenschaften der Eigenschaften der Eigenschaften untersuchen. Daher kann berücksichtigt werden, dass eine Eigenschaft einen Namen und 4 Attribute enthält.
Die vier Eigenschaften einer numerischen Eigenschaft sind ihr Wert, schriftlich, aufzählbar und konfigurierbar.
Accessor -Attribute haben keine Wertmerkmale und Schreibfähigkeit, daher enthalten sie: Read (GET), Write (Set), Aufzählung und Konfigurierbarkeit.
ES5 definiert ein Objekt mit dem Namen "Attributdeskriptor", das diese 4 Attribute darstellt. Die Attribute des Deskriptorobjekts des Datenattributs umfassen Wert, beschreibbar, aufzählbar und konfigurierbar. Das Deskriptorobjekt des Accessor -Attributs wird durch das GET -Attribut und das Set -Attribut ersetzt. Unter ihnen sind beschreibbare, aufzählbare und konfigurierbare Boolesche Werte, und das Attribut und ein Set -Attribut sind Funktionswerte.
Sie können den Eigenschaftsdeskriptor für eine bestimmte Eigenschaft eines Objekts erhalten, indem Sie Object.getownPropertyDescriptor () aufrufen:
//Return {value: 1, writable: true, enumerable: true, configurable: true}Object.getOwnProeprtyDescriptor({x: 1},"x");//Query the octet property of the random object defined above//Return {get: /*func */, set: undefined, enumerable: true, configurable: true}Object.getOwnPropertyDesciptor(random, "Oktett"); // für ererbte Attribute und nicht existierende Attribute, return undefinedObject.getownPropertyDesciptor ({}, "x");Wie Sie aus dem Funktionsnamen sehen können, kann Object.getownPropertyDesciptor () nur den Deskriptor seiner eigenen Eigenschaften erhalten. Um die Eigenschaften ererbter Attribute zu erhalten, müssen Sie die Prototyp -Kette (Object.getPrototypeof ()) durchqueren.
Wenn Sie die Eigenschaften der Eigenschaften festlegen oder die neu erstellten Eigenschaften bestimmte Eigenschaften aufweisen möchten, müssen Sie Objekt aufrufen.
// Eigenschaften existieren, aber OX kann nicht aufgezählt werden; // => 1Object.keys (o) // => [] // Jetzt die Eigenschaft X so modifizieren, dass es schreib--objekt.defineProperty (o, "x", {writable: true}); // Die Ansicht ändert den Wert dieser Eigenschaft ox = 2; // Die Operation schlägt fehl, aber es werden keine Fehler gemeldet, und eine Typ -Fehlerausnahme wird im strengen Modus geworfen. 0;}}); ox // => 0Wenn Sie gleichzeitig mehrere Eigenschaften ändern oder erstellen möchten, müssen Sie Object.defineProperties () verwenden. Der erste Parameter ist das zu modifizierende Objekt, und der zweite Parameter ist eine Zuordnungstabelle. Zum Beispiel:
var p = Object.DefineProperties ({}, {x: {value: 1, beschreibbar: true, enumerable: true, konfigurierbar: true}, y: {value: 2, schriftlich: true, enumerable: true, konfigurierbar: true}, r: {Get: function () {{{{th.sqrt: true, konfigurierbar: true}});Altmodische APIs für Getter und Setter: Vor ES5 können die meisten JavaScript-Implementierungen das Get-and-Set-Schreiben in Object Direct Mengensyntax bereits unterstützen. Diese Implementierungen bieten nicht standardmäßige altmodische APIs für Abfragen und Setzen von Getttern und Setter. Diese APIs bestehen aus vier Methoden, und alle Objekte haben diese Methoden.
__lookupGgers __ () und __lookupsetter __ () werden verwendet, um eine benannte Attribut -Getter- und Setter -Methode zurückzugeben.
__defineGetter __ () und __definesSetter __ () werden verwendet, um Getter und Setter zu definieren. Der erste Parameter ist der Attributname, und der zweite Parameter sind die Getter- und Setter -Methoden.
var o = {}; o .__ DefineGetter __ ("x", function () {return 0;}); o .__ DefinesSerTter __ ("y", Funktion (Wert) {console.log ("value:" + Wert);});4. Drei Eigenschaften eines Objekts
Jedes Objekt verfügt über einen Prototyp, eine Klasse und ein erweiterbares Attribut, das sich darauf bezieht. Lassen Sie uns als nächstes darüber sprechen, was diese Attribute tun.
4.1 Prototypeigenschaften
Die Prototypattribute eines Objekts werden verwendet, um Attribute zu erben. Wir nennen oft "O -Prototyp -Attribute" direkt "O's Prototyp". Zuvor haben "Objekte erstellen" drei Möglichkeiten zum Erstellen von Objekten eingeführt. Von Objekten erstellte Objekte werden als Prototyp mit Object.Prototyp verwendet. Objekte, die durch Neue erstellt wurden, verwenden Sie das Prototyp -Attribut des Konstruktors als Prototyp. Objekte, die mit Object.Create () erstellt wurden, verwenden Sie den ersten Parameter als Prototyp.
In ES5 kann der Objektprototyp über Object.getPrototypeof () abgefragt werden. In ES3 gibt es keine äquivalente Funktion, sondern der Expression O.Constructor.Prototyp wird verwendet, um den Prototyp des Objekts zu überprüfen.
Um festzustellen, ob ein Objekt ein Prototyp eines anderen Objekts ist (oder sich in der Prototypkette befindet), verwenden Sie die isprototypeof () -Methode. Sie können beispielsweise feststellen, ob P ein Prototyp von O von P.risprototypeof (O) ist:
var p = {x: 1}; // ein Prototyp -Objekt var o = Object.create (p) definieren; // Verwenden Sie diesen Prototyp, um ein Objekt zu erstellen. // => true, o erbelt von pOBject.prototype.riprototypeof (o) // => true, p erbt aus Object.PrototypeVon Mozilla implementiertes JavaScript enthält ein speziell benannter Attribut __Proto__, um den Objektprototyp direkt abzufragen/festzulegen. IE und Opera unterstützen jedoch nicht das __Proto__ -Attribut, daher wird nicht empfohlen, das __Proto__ -Attribut direkt zu verwenden.
4.2 Klassenattribute
Das Klassenattribut eines Objekts ist ein String, der die Typinformationen des Objekts darstellt. Sowohl ES3 als auch ES5 bieten Methoden zur Festlegung dieser Eigenschaft, und es gibt nur eine indirekte Möglichkeit, sie abzufragen. Die Standard -Methode für toString () gibt eine Zeichenfolge in diesem Format zurück: [Objektklasse].
Sie können die Methode toString () aufrufen und dann die Zeichen zwischen dem achten und der vorletzten Position der zurückgegebenen Zeichenfolge extrahieren. Es gibt jedoch ein Problem, dass viele Objekte ToString () -Methoden geerbt haben. Um die korrekte toString () -Version aufrufen zu können, muss die Methode der Funktion.call () indirekt aufgerufen werden. Die KlasseOF -Funktion im folgenden Beispiel kann die Klasse eines beliebigen Objekts zurückgeben:
Funktionsklasse (o) {if (o === null) return "null"; if (o === undefiniert) return "undefined"; return Object.Prototype.toString.call (o) .lice (8, -1);};4.3 Skalierbarkeit
Die Erweiterbarkeit des Objekts wird verwendet, um anzuzeigen, ob dem Objekt neue Eigenschaften hinzugefügt werden können. Alle integrierten und benutzerdefinierten Objekte sind explizit erweiterbar. In ES5 können Objekte in nicht skalierbares Umfang umgewandelt werden.
Neben der Einstellung des Objekts, das nicht mehr erwidert ist, kann die Methode von Objeal.Seal () alle Eigenschaften des Objekts so einstellen, dass sie nicht konfigurierbar sind. Das heißt, dem Objekt können neue Attribute nicht hinzugefügt werden, und vorhandene Attribute können nicht gelöscht und konfiguriert werden.
Die Methode von Object.isaled () wird verwendet, um festzustellen, ob das Objekt beigefügt ist.
Die Methode von Object.Freeze () sperrt Objekte strenger. Zusätzlich zur Funktion des Object.Seal () -Methode kann sie alle eigenen Datenattribute auf nur schreibgeschützt einstellen (wenn das Zubehör-Attribut des Objekts eine Setter-Methode aufweist, wird das Accessor-Attribut nicht beeinflusst und Sie können sie weiterhin aufrufen, indem Sie den Attributen Werte zuweisen).
Object.isFrozen () wird verwendet, um festzustellen, ob das Objekt eingefroren ist.
5. Objekte serialisieren
Die Objekt -Serialisierung bezieht sich auf die Umwandlung des Status eines Objekts in eine Zeichenfolge, oder Sie können die Zeichenfolge in ein Objekt wiederherstellen. ES5 bietet integrierte Funktionen json.stringify () und json.parse (), um JavaScript-Objekte zu serialisieren und wiederherzustellen. Diese Methoden verwenden JSON als Datenaustauschformat. Zum Beispiel:
o = {x: 1, y: {z: [false, null, ""]}}; // ein Testobjekt definieren s = json.stringify (o); // {"x": 1, "y": {"z": [false, null, ""]}} p = json.Parse (s); // p ist eine tiefe Kopie von oDie Syntax von JSON ist eine Teilmenge der JavaScript -Syntax und kann nicht alle Werte in JavaScript darstellen. Objekte, Arrays, Saiten, unendliche Zahlen, wahr, falsch und Null werden unterstützt und können serialisiert und wiederhergestellt werden. Nan-, Infinity- und -Infinity -Serialisierungsergebnisse sind alle Null. Funktionen, Regexp, Fehlerobjekte und undefinierte Werte können nicht serialisiert und wiederhergestellt werden.
Hier füge ich die Methode des Objekts hinzu:
toString () Methode: Es gibt eine Zeichenfolge zurück, die den Wert des Objekts darstellt, das diese Methode aufruft. Viele Objekte haben die Methode toString () wie Array.ToString (), Date.toString () und Funktion.ToString () neu geschrieben.
tojson () Methode: Object.Prototyp definiert die Methode tojson (), sondern aufgrund der Notwendigkeit, Serialisierung durchzuführen, wird die Methode jSON.Stringify () die Methode tojson () aufgerufen. Wenn diese Methode im serialisierten Objekt vorhanden ist, wird sie aufgerufen.
ValueOF () -Methode: Die ValueOF () -Methode ist der Methode toString () sehr ähnlich, aber JavaScript nennt sie häufig, wenn sie ein Objekt eher in einen bestimmten ursprünglichen Wert als in eine Zeichenfolge konvertiert, insbesondere wenn es in eine Zahl konvertiert wird. Einige integrierte Klassen passen die ValueOf () -Methode an, z. B. Datum.ValueOf ().
Der obige Artikel versteht umfassend, dass die Weiterentwicklung von JavaScript -Objekten der Inhalt ist, den ich mit Ihnen teile. Ich hoffe, es kann Ihnen eine Referenz geben und ich hoffe, Sie können Wulin.com mehr unterstützen.