Bisher habe ich drei Möglichkeiten zum Erstellen eines Objekts in JavaScript gesehen. Welcher Weg eignet sich am besten zum Erstellen eines Objekts und warum?
Ich habe auch gesehen, dass in all diesen Beispielen das Schlüsselwort var
nicht vor einer Eigenschaft verwendet wird - warum? Ist es nicht erforderlich, var
vor dem Namen einer Eigenschaft zu deklarieren, dass Eigenschaften Variablen sind?
In der zweiten und dritten Art ist der Name des Objekts in Großbuchstaben, während in erster Linie der Name des Objekts in Kleinbuchstaben ist. Welchen Fall sollten wir für einen Objektnamen verwenden?
Erster Weg:
function person(fname, lname, age, eyecolor){
this.firstname = fname;
this.lastname = lname;
this.age = age;
this.eyecolor = eyecolor;
}
myFather = new person("John", "Doe", 50, "blue");
document.write(myFather.firstname + " is " + myFather.age + " years old.");
Zweiter Weg:
var Robot = {
metal: "Titanium",
killAllHumans: function(){
alert("Exterminate!");
}
};
Robot.killAllHumans();
Dritter Weg - JavaScript-Objekte mit Array-Syntax:
var NewObject = {};
NewObject['property1'] = value;
NewObject['property2'] = value;
NewObject['method'] = function(){ /* function code here */ }
javascript
object
Jamna
quelle
quelle
var
Object.create()
?Antworten:
Es gibt keinen besten Weg, es hängt von Ihrem Anwendungsfall ab.
Person
(Sie sollten den Namen mit einem Großbuchstaben beginnen) wird die Konstruktorfunktion genannt . Dies ähnelt Klassen in anderen OO-Sprachen.Update: Wie angeforderte Beispiele für den dritten Weg.
Abhängige Eigenschaften:
Die folgende funktioniert nicht
this
nicht nicht verweisenbook
. Es gibt keine Möglichkeit, eine Eigenschaft mit Werten anderer Eigenschaften in einem Objektliteral zu initialisieren:Stattdessen könnten Sie Folgendes tun:
Dynamische Eigenschaftsnamen:
Wenn der Eigenschaftsname in einer Variablen gespeichert oder durch einen Ausdruck erstellt wird, müssen Sie die Klammernotation verwenden:
quelle
...
, um von einem anderen Objekt zu erben?Es gibt verschiedene Möglichkeiten, eine Funktion zu definieren. Es basiert vollständig auf Ihrer Anforderung. Nachfolgend einige Stile: -
Beispiele:
Sie können es auf der Konsole versuchen, wenn Sie Verwirrung haben.
quelle
var person
das am Ende genau dieselbe Instanz liefert ? Zum Beispiel im Funktionskonstruktor können Sie einfach hinzufügenvar person = new Person("Anand")
. und was ist mit der scheinbar zufälligen Verwendung von Semikolons los? : PEs gibt keinen "besten Weg", ein Objekt zu erstellen. Jeder Weg hat je nach Anwendungsfall Vorteile.
Das Konstruktormuster (eine Funktion, die mit dem
new
Operator gepaart ist , um es aufzurufen) bietet die Möglichkeit, die prototypische Vererbung zu verwenden, während die anderen Methoden dies nicht tun. Wenn Sie also eine prototypische Vererbung wünschen, ist eine Konstruktorfunktion ein guter Weg.Wenn Sie jedoch eine prototypische Vererbung wünschen, können Sie diese auch verwenden
Object.create
, wodurch die Vererbung offensichtlicher wird.Das Erstellen eines Objektliteral (z.
var obj = {foo: "bar"};
B. :) funktioniert hervorragend, wenn Sie zum Zeitpunkt der Erstellung über alle Eigenschaften verfügen, die Sie festlegen möchten.Zum späteren Festlegen von Eigenschaften ist die
NewObject.property1
Syntax im Allgemeinen vorzuziehen,NewObject['property1']
wenn Sie den Eigenschaftsnamen kennen. Letzteres ist jedoch nützlich, wenn Sie den Namen der Eigenschaft nicht im Voraus haben (z. B. :)NewObject[someStringVar]
.Hoffe das hilft!
quelle
Ich denke, es hängt davon ab, was Sie wollen. Für einfache Objekte könnten Sie die zweite Methode verwenden. Wenn Ihre Objekte größer werden und Sie ähnliche Objekte verwenden möchten, ist die erste Methode wahrscheinlich besser. Auf diese Weise können Sie es auch mit Prototypen erweitern.
Beispiel:
Ich bin kein großer Fan der dritten Methode, aber sie ist zum Beispiel sehr nützlich, um Eigenschaften dynamisch zu bearbeiten
var foo='bar'; var bar = someObject[foo];
.quelle
Es gibt viele Möglichkeiten, Ihre Objekte in JavaScript zu erstellen. Die Verwendung einer Konstruktorfunktion zum Erstellen eines Objekts oder einer Objektliteralnotation verwendet viel in JavaScript. Wenn Sie eine Instanz von Object erstellen und anschließend Eigenschaften und Methoden hinzufügen, gibt es drei gängige Methoden zum Erstellen von Objekten in JavaScript.
Konstruktorfunktionen
Es gibt integrierte Konstruktorfunktionen, die wir alle von Zeit zu Zeit verwenden können, wie Date (), Number (), Boolean () usw. Alle Konstruktorfunktionen beginnen mit Großbuchstaben. In der Zwischenzeit können wir benutzerdefinierte Konstruktorfunktionen in JavaScript erstellen so was:
und Sie können es einfach mit new () aufrufen, um eine neue Instanz des Konstruktors zu erstellen, etwas wie das folgende erstellen und die Konstruktorfunktion mit gefüllten Parametern aufrufen:
Objektliterale
Die Verwendung von Objektliteralen wird häufig beim Erstellen von Objekten in JavaScript verwendet. Dies ist ein Beispiel für das Erstellen eines einfachen Objekts. Sie können Ihren Objekteigenschaften alles zuweisen, solange sie definiert sind:
Prototyp entwickeln
Nachdem Sie ein Objekt erstellt haben, können Sie weitere Elemente als Prototyp erstellen, z. B. indem Sie unserer Box Farbe hinzufügen. Wir können dies tun:
quelle
Während viele Leute hier sagen, dass es keinen besten Weg für die Objekterstellung gibt, gibt es eine Begründung dafür, warum es ab 2019 so viele Möglichkeiten gibt, Objekte in JavaScript zu erstellen, und dies hat mit dem Fortschritt von JavaScript über die verschiedenen Iterationen zu tun von EcmaScript-Veröffentlichungen aus dem Jahr 1997.
Vor ECMAScript 5 gab es nur zwei Möglichkeiten, Objekte zu erstellen: die Konstruktorfunktion oder die Literalnotation (eine bessere Alternative zu new Object ()). Mit der Konstruktorfunktionsnotation erstellen Sie ein Objekt, das in mehrere Instanzen instanziiert werden kann (mit dem neuen Schlüsselwort), während die Literalnotation ein einzelnes Objekt wie einen Singleton liefert.
Unabhängig von der von Ihnen verwendeten Methode sind JavaScript-Objekte einfach Eigenschaften von Schlüsselwertpaaren:
In früheren Versionen von JavaScript bestand die einzige Möglichkeit, die klassenbasierte Vererbung nachzuahmen, in der Verwendung von Konstruktorfunktionen. Die Konstruktorfunktion ist eine spezielle Funktion, die mit dem Schlüsselwort 'new' aufgerufen wird. Konventionell wird die Funktionskennung großgeschrieben, albiet ist sie nicht erforderlich. Innerhalb des Konstruktors verweisen wir auf das Schlüsselwort 'this', um dem Objekt, das die Konstruktorfunktion implizit erstellt, Eigenschaften hinzuzufügen. Die Konstruktorfunktion gibt das neue Objekt mit den aufgefüllten Eigenschaften implizit implizit an die aufrufende Funktion zurück, es sei denn, Sie verwenden explizit das Schlüsselwort return und geben etwas anderes zurück.
Es liegt ein Problem mit der sayName-Methode vor. In objektorientierten klassenbasierten Programmiersprachen verwenden Sie normalerweise Klassen als Fabriken, um Objekte zu erstellen. Jedes Objekt verfügt über eigene Instanzvariablen, jedoch über einen Zeiger auf die im Klassenentwurf definierten Methoden. Wenn Sie die Konstruktorfunktion von JavaScript verwenden, wird bei jedem Aufruf eine neue sayName-Eigenschaft für das neu erstellte Objekt definiert. Jedes Objekt verfügt also über eine eigene Eigenschaft sayName. Dies verbraucht mehr Speicherressourcen.
Neben der Erhöhung der Speicherressourcen wird durch die Definition von Methoden innerhalb der Konstruktorfunktion die Möglichkeit der Vererbung ausgeschlossen. Auch hier wird die Methode als Eigenschaft für das neu erstellte Objekt und für kein anderes Objekt definiert, sodass die Vererbung nicht wie folgt funktionieren kann. Daher stellt JavaScript die Prototypenkette als eine Form der Vererbung bereit, wodurch JavaScript zu einer prototypischen Sprache wird.
Wenn Sie ein Elternteil haben und ein Elternteil viele Eigenschaften eines Kindes teilt, sollte das Kind diese Eigenschaften erben. Vor ES5 wurde dies wie folgt erreicht:
Die Art und Weise, wie wir die obige Prototypenkette verwendet haben, ist eigenartig. Da der Prototyp ein Live-Link ist, würden Sie durch Ändern der Eigenschaft eines Objekts in der Prototypkette auch dieselbe Eigenschaft eines anderen Objekts ändern. Das Ändern der geerbten Methode eines Kindes sollte natürlich nicht die Methode des Elternteils ändern. Object.create hat dieses Problem mithilfe einer Polyfüllung behoben. Mit Object.create können Sie also die Eigenschaft eines Kindes in der Prototypkette sicher ändern, ohne die gleiche Eigenschaft des Elternteils in der Prototypkette zu beeinflussen.
ECMAScript 5 führte Object.create ein, um den oben genannten Fehler in der Konstruktorfunktion für die Objekterstellung zu beheben. Die Object.create () -Methode ERSTELLT ein neues Objekt, wobei ein vorhandenes Objekt als Prototyp des neu erstellten Objekts verwendet wird. Da ein neues Objekt erstellt wird, besteht kein Problem mehr, bei dem durch Ändern der untergeordneten Eigenschaft in der Prototypkette der Verweis des übergeordneten Elements auf diese Eigenschaft in der Kette geändert wird.
Vor ES6 gab es hier ein allgemeines Erstellungsmuster für die Verwendung von Funktionskonstruktoren und Object.create:
Jetzt wurde Object.create in Verbindung mit Konstruktorfunktionen häufig für die Objekterstellung und -vererbung in JavaScript verwendet. ES6 führte jedoch das Konzept von Klassen ein, bei denen es sich in erster Linie um syntaktischen Zucker gegenüber der vorhandenen prototypbasierten Vererbung von JavaScript handelt. Die Klassensyntax führt kein neues objektorientiertes Vererbungsmodell in JavaScript ein. Somit bleibt JavaScript eine prototypische Sprache.
ES6-Klassen erleichtern die Vererbung erheblich. Wir müssen die Prototypfunktionen der übergeordneten Klasse nicht mehr manuell kopieren und den Konstruktor der untergeordneten Klasse zurücksetzen.
Insgesamt fielen diese 5 verschiedenen Strategien der Objekterstellung in JavaScript mit der Entwicklung des EcmaScript-Standards zusammen.
quelle
Im obigen Beispiel sehen Sie, dass ein leeres Objekt tatsächlich Eigenschaften hat.
Ok, zuerst wollen wir sehen, welcher der beste Weg ist:
Im obigen Beispiel gibt das Protokoll false aus.
Lassen Sie uns nun sehen, warum die anderen Objekterstellungsmethoden falsch sind.
Wie Sie oben sehen können, protokollieren alle Beispiele true. Wenn Sie also eine
for in
Schleife haben, um festzustellen, ob das Objekt eine Eigenschaft hat, führt dies wahrscheinlich zu falschen Ergebnissen.Beachten Sie, dass dies am besten nicht einfach ist. Sie müssen alle Eigenschaften des Objekts zeilenweise definieren. Die anderen Methoden sind einfacher und enthalten weniger Code zum Erstellen eines Objekts. In einigen Fällen müssen Sie sich jedoch bewusst sein. Ich benutze übrigens immer die "anderen Wege" und eine Lösung für die obige Warnung, wenn Sie nicht den besten Weg benutzen, ist:
quelle
Hauptsächlich gibt es 3 Möglichkeiten, Objekte zu erstellen:
Am einfachsten ist die Verwendung von Objektliteralen .
Obwohl diese Methode die einfachste ist, aber einen Nachteil hat, dh wenn Ihr Objekt Verhalten aufweist (Funktionen darin), müssen Sie es in Zukunft in allen Objekten ändern, wenn Sie Änderungen daran vornehmen möchten .
In diesem Fall ist es besser, Factory- oder Konstruktorfunktionen zu verwenden (jeder, den Sie mögen).
Factory-Funktionen sind Funktionen, die ein object.eg- zurückgeben.
Konstruktorfunktionen sind Funktionen, die Objekten mit "this" keyword.eg- Eigenschaften zuweisen.
quelle