JavaScript: mit Konstruktor ohne Operator ‚neue‘
-
20-09-2019 - |
Frage
Bitte helfen Sie mir zu verstehen, warum die folgenden Code funktioniert:
<script>
var re = RegExp('\\ba\\b') ;
alert(re.test('a')) ;
alert(re.test('ab')) ;
</script>
In der ersten Zeile gibt es keine new
Betreiber.
Soweit ich weiß, ein contructor in JavaScript ist eine Funktion, die initialize erstellt von Objekten der Betreiber new
und sie sind nicht auf Rückkehr nichts bedeuten.
Lösung
In der Regel, wenn etwas als eine Konstruktor Verwendung new
damit dokumentiert. Aber in diesem Fall hat RegExp
ein definierte „Fabrik“ Verhalten für den Fall, dass Sie es als eine Funktion stattdessen genannt habe. Siehe Abschnitt 15.10.3 des ECMAScript (JavaScript) Spezifikation ( dass Links auf die abgehende spec, die Abschnittsnummer ist das gleiche in der neuen Spezifikation, die Sie von der ECMA Front herunterladen [auf der rechten Seite]; ich will nicht direkt Link zu einer ~ 4 MB PDF-Datei):
15.10.3 Die RegExp Constructor als eine Funktion namens
15.10.3.1 RegExp (Muster, Fahnen)
Wenn Muster ein Objekt R, das [[Klasse]] Eigenschaft ist „RegExp“ und Flaggen nicht definiert ist, dann zurück R unverändert. Andernfalls der RegExp Konstruktor aufrufen (15.10.4.1), ist es die Muster und Fahnen Argumente zu übergeben und das Objekt zurück von diesem Konstruktor konstruiert.
Sie können Ihre eigenen JavaScript Konstruktorfunktionen tatsächlich definieren, damit das new
Schlüsselwort Weglassen (durch den Nachweis haben sie als Funktion stattdessen aufgerufen wurde, und sich umzudrehen und sich richtig fordern), aber ich würde vorschlagen, es nicht wie es führt In dem Code irreführend.
Andere Tipps
1 TJ Crowder hat. Der ECMAScript-Standard geht von seinem Weg Verhaltensweisen für die Einbau-Konstruktor Funktionen zu definieren, wenn du als Ebene-Funktionen aufgerufen. Oft einfach es nennt sich wieder als Konstrukteur, aber es gibt einige kompliziertere Fälle.
Konstrukteuren in Javascript [...] sind nicht auf Rückkehr etwas gemeint
Im Allgemeinen ist ein Konstruktor können this
ignorieren und nur ein unabhängiges Objekt zurückgeben:
function Thing() {
return {'foo': 1};
}
In diesem Fall können Sie ebenso die Funktion als Konstruktor (mit new
) oder einer reinen Funktion.
Wenn der Konstruktor gibt nichts zurück, als das übliche Muster für Konstrukteure ist, sorgt der new
Betreiber selbst, dass es das neue Objekt kehrt als this
erstellt und weitergegeben. In diesem Fall müssen Sie new
verwenden.
Es ist am besten nicht auf einem Konstruktor als bloße Funktion arbeiten zu verlassen, und die alternativen Verhaltensweisen des integrierte Konstruktoren selten von Nutzen sind, so im Allgemeinen sollten Sie mit new
bleiben.