Was ist der Unterschied zwischen dieser konstruktorbasierten Syntax zum Erstellen eines Objekts:
person = new Object()
... und diese wörtliche Syntax:
person = {
property1 : "Hello"
};
Es scheint, dass beide dasselbe tun, obwohl JSLint die Verwendung der Objektliteralnotation bevorzugt.
Welches ist besser und warum?
javascript
object
jslint
ectype
quelle
quelle
a = new Object
,a = new Object()
,a = {}
ist, wörtliche viel einfacher und einige Tests ich lief vor einiger Zeit sagen , dass es schneller ist, neuerer Compiler meiner Aussage falsch sein verursacht haben könnte. Gleiches gilt für wörtliche Arraysvar
Schlüsselwort in Ihrem Anwendungscode, um eine Verschmutzung des globalen Namespace und die Notwendigkeit zu vermeiden, über den aktuellen Datensatz im Stapel hinaus nach Ihren Variablen zu suchen.new
ist eine Konvention, die über die sinnlose Auswahl einer mittelmäßigen Sprache hinausgeht. Verwenden Sie,new
weil seine Bedeutung klar ist. In 99,9% der Fälle sind die Leistungssteigerungen irrelevant.Antworten:
Beide machen dasselbe (es sei denn, jemand hat etwas Ungewöhnliches getan), außer dass Ihr zweites Objekt erstellt und ihm eine Eigenschaft hinzufügt. Die Literalschreibweise benötigt jedoch weniger Platz im Quellcode. Es ist klar erkennbar, was gerade passiert.
new Object()
Wenn Sie also verwenden , tippen Sie wirklich nur mehr und führen (theoretisch, wenn nicht durch die JavaScript-Engine optimiert) einen unnötigen Funktionsaufruf durch.Diese
technisch nicht das gleiche tun. Der erste erstellt nur ein Objekt. Der zweite erstellt eine und weist eine Eigenschaft zu. Damit der erste identisch ist, benötigen Sie einen zweiten Schritt, um die Eigenschaft zu erstellen und zuzuweisen.
Das "Ungewöhnliche", das jemand tun könnte, wäre, den Standard
Object
global zu beschatten oder zuzuweisen :In diesem höchst ungewöhnlichen Fall
new Object
wird aber scheitern{}
wird funktionieren.In der Praxis gibt es nie einen Grund,
new Object
anstatt zu verwenden{}
(es sei denn, Sie haben diese sehr ungewöhnliche Sache getan).quelle
()
new Object()
ist auch nicht erforderlich. (spricht über nicht benötigtes Ding)Für ein einfaches Objekt ohne Methoden wie in Ihrem Beispiel gibt es keinen Unterschied. Es gibt jedoch einen großen Unterschied, wenn Sie Ihrem Objekt Methoden hinzufügen.
Wörtlicher Weg:
Prototyp Weg:
In beiden Fällen können Instanzen
Obj
wie diese erstellt werden:Mit der wörtlichen Methode tragen Sie jedoch eine Kopie der
sayHello
Methode in jeder Instanz Ihrer Objekte. Während beim Prototyp die Methode im Objektprototyp definiert und von allen Objektinstanzen gemeinsam genutzt wird. Wenn Sie viele Objekte oder Methoden haben, kann der wörtliche Weg zu einer ziemlich großen Speicherverschwendung führen.quelle
new Object()
vs{}
zum Erstellen leerer Objekte.In JavaScript können wir ein neues leeres Objekt auf zwei Arten deklarieren:
Ich habe nichts gefunden, was darauf hindeutet, dass es einen signifikanten Unterschied zwischen diesen beiden in Bezug auf ihre Funktionsweise hinter den Kulissen gibt (bitte korrigieren Sie mich, wenn ich falsch liege - ich würde es gerne wissen). Die zweite Methode (unter Verwendung der Objektliteralnotation) bietet jedoch einige Vorteile.
Stellen Sie sich ein neues Objekt vor, das den Mitgliedsnamen und TelNo enthält. Mit der neuen Object () -Konvention können wir sie folgendermaßen erstellen:
Die Expando-Eigenschaften von JavaScript können wir auf diese Weise im neue Mitglieder erstellen und das erreichen, was beabsichtigt war. Dieser Weg ist jedoch nicht sehr strukturiert oder gekapselt. Was wäre, wenn wir die Mitglieder bei der Erstellung angeben wollten, ohne uns auf die Eigenschaften von expando und die Zuweisung nach der Erstellung verlassen zu müssen?
Hier kann die Objektliteralnotation helfen:
Hier haben wir den gleichen Effekt in einer Codezeile und deutlich weniger Zeichen erzielt.
Eine weitere Diskussion der oben genannten Objektkonstruktionsmethoden finden Sie unter: JavaScript und Object Oriented Programming (OOP).
Und schließlich, was ist mit dem Idioten, der Object außer Kraft gesetzt hat? Hast du gedacht, dass es nicht möglich ist? Nun, diese JSFiddle beweist das Gegenteil . Die Verwendung der Objekt-Literal-Notation verhindert, dass wir diesem Trottel verfallen.
(Von http://www.jameswiseman.com/blog/2011/01/19/jslint-messages-use-the-object-literal-notation/ )
quelle
new Object()
weil die Objektfunktion möglicherweise von etwas überschrieben wurde, sollten Sie auch überall Wachen schreiben, wenn Sie Helfer verwendenObject.keys
, um sicherzustellen, dass sie nicht undefiniert sind, was zu Absurdität führt. Ich würde immer empfehlen, die wörtliche Notation zu verwenden, aber ich denke, dieses spezielle Argument fällt auseinander, wenn Sie über die Konsequenzen eines solchen Denkens nachdenken.Auf meinem Computer mit Node.js habe ich Folgendes ausgeführt:
Beachten Sie, dass dies eine Erweiterung dessen ist, was hier zu finden ist: Warum ist arr = [] schneller als arr = new Array?
Meine Ausgabe war die folgende:
{} und [] sind also eindeutig schneller als die Verwendung von new zum Erstellen leerer Objekte / Arrays.
quelle
Alle hier sprechen über die Ähnlichkeiten der beiden. Ich werde auf die Unterschiede hinweisen.
Mit
new Object()
können Sie ein anderes Objekt übergeben. Das offensichtliche Ergebnis ist, dass das neu erstellte Objekt auf dieselbe Referenz gesetzt wird. Hier ist ein Beispielcode:Die Verwendung ist nicht auf Objekte wie in OOP-Objekten beschränkt. Andere Typen könnten ebenfalls an ihn übergeben werden. Die Funktion stellt den Typ entsprechend ein. Wenn wir beispielsweise die Ganzzahl 1 übergeben, wird ein Objekt vom Typ Nummer für uns erstellt.
Das mit der obigen Methode (
new Object(1)
) erstellte Objekt wird in den Objekttyp konvertiert, wenn ihm eine Eigenschaft hinzugefügt wird.Wenn das Objekt eine Kopie einer untergeordneten Objektklasse ist, können wir die Eigenschaft ohne die Typkonvertierung hinzufügen.
quelle
str
es vom Typ ist,string
sodass Sie ihm keine Eigenschaft zuweisen können. jsfiddle.net/grq6hdx7/1var obj = new Object("foo"); typeof obj; obj === "foo" // true
Tatsächlich gibt es verschiedene Möglichkeiten, Objekte in JavaScript zu erstellen. Wenn Sie nur ein Objekt erstellen möchten, hat das Erstellen von " konstruktorbasierten " Objekten mit dem Operator " new " keinen Vorteil . Es ist dasselbe wie das Erstellen eines Objekts mit der Syntax " Objektliteral ". " Konstruktorbasierte " Objekte, die mit dem Operator " new " erstellt wurden, sind jedoch unglaublich nützlich, wenn Sie über " prototypische Vererbung " nachdenken . Sie können die Vererbungskette nicht mit Objekten verwalten, die mit Literal-Syntax erstellt wurden. Sie können jedoch eine Konstruktorfunktion erstellen , Eigenschaften und Methoden an den Prototyp anhängen."operator, gibt es ein Objekt zurück, das Zugriff auf alle Methoden und Eigenschaften hat, die mit dem Prototyp dieser Konstruktorfunktion verknüpft sind.
Hier ist ein Beispiel für das Erstellen eines Objekts mithilfe der Konstruktorfunktion (siehe Code-Erklärung unten):
Jetzt können Sie so viele Objekte erstellen, wie Sie möchten, indem Sie die Personenkonstruktionsfunktion instanziieren. Alle Objekte erben den vollständigen Namen () davon.
Hinweis: Das Schlüsselwort " this " bezieht sich auf ein leeres Objekt innerhalb einer Konstruktorfunktion. Wenn Sie mit dem Operator " new " ein neues Objekt aus Person erstellen , wird automatisch ein Objekt zurückgegeben, das alle Eigenschaften und Methoden enthält, die mit dem Schlüsselwort " this " verknüpft sind . Und diese Objekte erben mit Sicherheit die Methoden und Eigenschaften, die mit dem Prototyp der Person-Konstruktorfunktion verbunden sind (was der Hauptvorteil dieses Ansatzes ist).
Übrigens, wenn Sie die gleiche Funktionalität mit der " Objektliteral " -Syntax erhalten möchten, müssen Sie für alle Objekte wie folgt den vollständigen Namen () erstellen:
Wenn Sie jetzt fragen, warum ich den Konstruktorfunktionsansatz anstelle des Objektliteralansatzes verwenden soll :
*** Die prototypische Vererbung ermöglicht eine einfache Vererbungskette, die äußerst nützlich und leistungsfähig sein kann.
*** Es spart Speicher, indem allgemeine Methoden und Eigenschaften geerbt werden, die im Prototyp der Konstruktorfunktionen definiert sind. Andernfalls müssten Sie sie in allen Objekten immer wieder kopieren.
Ich hoffe das macht Sinn.
quelle
Object.create(<object defined using literal notation>)
odernew Object(<object defined using literal notation>)
erstellen.function Person(firstname, lastname) { this.firstname = firstname; this.lastname = lastname; } Person.prototype.fullname = function() { console.log(this.firstname + ' ' + this.lastname); } var zubaer = new Person('Zubaer', 'Ahammed'); var john = new Person('John', 'Doe'); zubaer.fullname(); // Zubaer Ahammed john.fullname(); // John Doe zubaer.constructor.prototype.fullname = function() { console.log( 'Hello ' + this.firstname); } zubaer.fullname(); // Hello Zubaer john.fullname(); // Hoello John
Auch nach einigen der O'Really-Javascript-Bücher .... (zitiert)
Ein weiterer Grund für die Verwendung von Literalen im Gegensatz zum Objektkonstruktor ist, dass es keine Bereichsauflösung gibt. Da Sie möglicherweise einen lokalen Konstruktor mit demselben Namen erstellt haben, muss der Interpreter die Bereichskette von der Stelle, an der Sie Object () aufrufen, bis zum Auffinden des globalen Objektkonstruktors nachschlagen.
quelle
Ich habe einen Unterschied für ES6 / ES2015 festgestellt. Sie können ein Objekt nicht mit der Kurzpfeil-Funktionssyntax zurückgeben, es sei denn, Sie umgeben das Objekt mit
new Object()
.Dies liegt daran, dass der Compiler durch die
{}
Klammern verwirrt ist und denkt,n: i
es handele sich um ein Label: Anweisungskonstrukt ; Das Semikolon ist optional, damit es sich nicht darüber beschwert.Wenn Sie dem Objekt eine weitere Eigenschaft hinzufügen, wird schließlich ein Fehler ausgegeben.
quelle
[1, 2, 3].map(v => { return {n: v}; });
Sie werden das gleiche Netz ...param => return_value
den Unterschied zwischen{}
undnew Object()
in diesem Fall.[1, 2, 3].map(v => ({n: v}));
Update 2019
Ich habe auf meinem OSX High Sierra 10.13.6-Knoten Version 10.13.0 denselben Code wie @rjloura ausgeführt, und dies sind die Ergebnisse
quelle
Die Speichernutzung ist unterschiedlich, wenn Sie 10.000 Instanzen erstellen.
new Object()
wird nur eine Kopie{}
behalten, während zehntausend Kopien aufbewahrt werden.quelle
new
erstellt ein neues Objekt. Sie benötigen beide die gleiche Menge an Speicher.