In einem anderen Frage wies ein Nutzer darauf hin, dass die new
Schlüsselwort gefährlich war, und schlug eine Lösung für die Objekterstellung vor, bei der keine new
. Ich habe nicht geglaubt, dass das stimmt, vor allem, weil ich Prototype, Scriptaculous und andere hervorragende JavaScript-Bibliotheken verwendet habe, und jede von ihnen hat die new
Stichwort.
Trotzdem habe ich gestern den Vortrag von Douglas Crockford im YUI-Theater gesehen und er sagte genau das Gleiche, dass er die new
Schlüsselwort nicht mehr in seinem Code ( Crockford über JavaScript - Akt III: Die ultimative Funktion - 50:23 Minuten ).
Ist es "schlecht", die new
Stichwort? Was sind die Vor- und Nachteile seiner Verwendung?
97 Stimmen
Es ist NICHT "schlecht", das Schlüsselwort new zu verwenden. Aber wenn Sie es vergessen, rufen Sie den Objektkonstruktor wie eine normale Funktion auf. Wenn Ihr Konstruktor seinen Ausführungskontext nicht überprüft, wird er nicht bemerken, dass "this" auf ein anderes Objekt (normalerweise das globale Objekt) statt auf die neue Instanz zeigt. Daher wird Ihr Konstruktor Eigenschaften und Methoden zum globalen Objekt (Fenster) hinzufügen. Wenn Sie in der Objektfunktion immer prüfen, ob "this" eine Instanz Ihres Objekts ist, werden Sie dieses Problem nie haben.
6 Stimmen
Ich kann das nicht verstehen. Einerseits rät Doug von der Verwendung von
new
. Aber wenn Sie sich die YUI-Bibliothek ansehen. Sie haben zu verwendennew
überall. Wie zum Beispielvar myDataSource = new Y.DataSource.IO({source:"./myScript.php"});
.2 Stimmen
@aditya_gaur Das liegt daran, dass man, wenn man eine Initialisierung eines Objekts benötigt, eine
init
Methode, wenn Sie dieObject.create
Ansatz und rufen Sie danach an. Viel einfacher ist es, einfach zu verwendennew
der beides tut, die Prototypenkette setzt und einen Initialisierungscode aufruft.71 Stimmen
Ich glaube nicht, dass die Sache geschlossen werden sollte. Ja, es wird wahrscheinlich einige Crockford-Antifan-Gifte auslösen, aber wir reden hier über den beliebten Rat, ein wichtiges Sprachfeature grundsätzlich zu vermeiden. Der Mechanismus, der dafür sorgt, dass jedes JQuery-Objekt fast nichts wiegt (was den Speicher betrifft), beinhaltet die Verwendung des Schlüsselworts "new". Ziehen Sie Factory-Methoden dem ständigen Aufrufen von new vor, aber schränken Sie Ihre architektonischen Möglichkeiten und Ihr Leistungspotenzial nicht drastisch ein, indem Sie nur Objektliterale verwenden. Sie haben ihre Berechtigung und Konstruktoren haben ihre Berechtigung. Das ist ein veralteter und miserabler Ratschlag.
1 Stimmen
Einen Ausführungskontext abzulehnen, der nicht von Ihrer Objektfunktion erbt, ist kein sinnvoller Ansatz. Sie haben dann kritische Funktionen wie .call und .apply unterbrochen.
5 Stimmen
TLDR: Verwendung
new
ist nicht gefährlich. Auslassen vonnew
gefährlich ist, und deshalb schlecht . Aber in ES5 können Sie verwenden Strenger Modus die Sie vor dieser und vielen anderen Gefahren schützt.3 Stimmen
Dieser gesamte Thread ist veraltet. Die derzeit beste Praxis ist die Verwendung von ES6-Modulen und, für die Vererbung, ES6-Klassen. Sie sind standardmäßig im Strict-Modus, was bedeuten würde, dass
this
wird nicht seinglobalThis
in einem Funktionsaufruf, aber es geht noch darüber hinaus: Klassen können nicht verwendet werden ohnenew
überhaupt . Seit ES6 hat sich die Sprache weiterentwickelt zu fördern die Verwendung vonnew
wie sie von neueren Konstrukteuren wieMap
oSet
nicht (mehr) benutzbar sein ohnenew
. Dagegen vorzugehen, erscheint nicht sinnvoll. Beachten Sie, dass alt Konstrukteure, z.B.new String
,new Date
,new Array
haben alt Regeln.