Crockford hat viel getan, um gute JavaScript-Techniken bekannt zu machen. Seine Stellungnahme zu Schlüsselelementen der Sprache hat viele nützliche Diskussionen ausgelöst. Trotzdem gibt es viel zu viele Menschen, die jede Verkündigung von "schlecht" oder "schädlich" als Evangelium betrachten und sich weigern, über die Meinung eines Mannes hinauszuschauen. Es kann manchmal etwas frustrierend sein.
Die Verwendung der durch das new
Schlüsselwort bereitgestellten Funktionalität hat mehrere Vorteile gegenüber der Erstellung jedes Objekts von Grund auf neu:
- Vererbung von Prototypen . Die native Vererbungstechnik von JavaScript ist ein einfaches und überraschend effektives Mittel zur Wiederverwendung von Code, obwohl sie von denjenigen, die an klassenbasierte OO-Sprachen gewöhnt sind, oft mit einer Mischung aus Misstrauen und Spott betrachtet wird. Und das neue Schlüsselwort ist das kanonische (und einzige plattformübergreifende) Mittel, um es zu verwenden.
- Performance. Dies ist ein Nebeneffekt # 1: Wenn ich für jedes Objekt 10 Methoden hinzufügen möchte ich schaffen, ich könnte nur eine Erstellungsfunktion schreiben , dass manuell jede Methode zu jedem neuen Objekt zuordnet ... Oder ich könnte sie auf die zuweisen Erstellungsfunktionen
prototype
und new
zum Ausstempeln neuer Objekte. Dies ist nicht nur schneller (es wird kein Code für jede Methode des Prototyps benötigt), sondern es wird auch vermieden, dass jedes Objekt mit separaten Eigenschaften für jede Methode überlagert wird. Auf langsameren Computern (oder insbesondere langsameren JS-Interpreten) kann dies beim Erstellen vieler Objekte zu einer erheblichen Zeit- und Speicherersparnis führen.
Und ja, new
hat einen entscheidenden Nachteil, der durch andere Antworten geschickt beschrieben wird: Wenn Sie vergessen, ihn zu verwenden, wird Ihr Code ohne Vorwarnung beschädigt. Glücklicherweise lässt sich dieser Nachteil leicht abmildern - fügen Sie der Funktion selbst einfach ein bisschen Code hinzu:
function foo()
{
// if user accidentally omits the new keyword, this will
// silently correct the problem...
if ( !(this instanceof foo) )
return new foo();
// constructor logic follows...
}
Jetzt können Sie die Vorteile nutzen, new
ohne sich um Probleme sorgen zu müssen, die durch versehentlichen Missbrauch verursacht wurden. Sie können der Prüfung sogar eine Behauptung hinzufügen, wenn Sie der Gedanke an fehlerhaften Code stört. Oder verwenden Sie, wie einige kommentiert haben, die Prüfung, um eine Laufzeitausnahme einzuführen:
if ( !(this instanceof arguments.callee) )
throw new Error("Constructor called as a function");
(Beachten Sie, dass mit diesem Snippet vermieden werden kann, dass der Name der Konstruktorfunktion fest codiert wird, da das Objekt im Gegensatz zum vorherigen Beispiel nicht tatsächlich instanziiert werden muss. Daher kann es ohne Änderung in jede Zielfunktion kopiert werden.)
John Resig geht in seinem einfachen "Klassen" -Instanzierungsbeitrag ausführlich auf diese Technik ein und fügt standardmäßig ein Mittel hinzu, um dieses Verhalten in Ihre "Klassen" zu integrieren. Auf jeden Fall eine Lektüre wert ... ebenso wie sein bevorstehendes Buch Secrets of the JavaScript Ninja , das in diesem und vielen anderen "schädlichen" Merkmalen der JavaScript-Sprache verborgenes Gold findet (das Kapitel darüber with
ist besonders aufschlussreich für diejenigen von uns, die es ursprünglich entlassen haben diese vielfach bösartige Funktion als Spielerei).