JavaScript: constructeur en utilisant sans opérateur « new »
-
20-09-2019 - |
Question
S'il vous plaît aidez-moi à comprendre pourquoi le code suivant fonctionne:
<script>
var re = RegExp('\\ba\\b') ;
alert(re.test('a')) ;
alert(re.test('ab')) ;
</script>
Dans la première ligne il n'y a pas d'opérateur de new
.
Pour autant que je sache, un contructor JavaScript est une fonction qui initialise les objets créés par le new
opérateur et ils ne sont pas censés retourner quoi que ce soit.
La solution
En général, si quelque chose est documenté comme étant un constructeur, utilisez new
avec elle. Mais dans ce cas, RegExp
a un comportement « usine » de la situation définie où vous avez appelé comme fonction à la place. Voir la section 15.10.3 de la ECMAScript (JavaScript) spécification ( que des liens vers les spécifications sortant, le numéro de section est la même dans la nouvelle spec, que vous pouvez télécharger à l'avant ECMA [sur le côté droit], je ne veux pas établir un lien direct vers un fichier PDF ~ 4 Mo):
15.10.3 Le constructeur RegExp appelé comme fonction 15.10.3.1 RegExp (motif, drapeaux) Si modèle est un objet R dont [[classe]] propriété est « RegExp » et des drapeaux est indéfini, puis revenir sans changement R. Sinon, appeler le constructeur RegExp (15.10.4.1), en lui passant les arguments de motif et des drapeaux et retourner l'objet construit par ce constructeur.
Vous pouvez réellement définir vos propres fonctions de constructeur JavaScript pour permettre l'omission du mot-clé new
(en détectant ils ont été appelés en fonction à la place, et de se retourner et se faisant appeler correctement), mais je ne voudrais pas suggérer qu'il conduit le code trompeur.
Autres conseils
1 TJ Crowder a. La norme ECMAScript sort de sa façon de définir les comportements pour les fonctions de constructeur intégrées lorsqu'elles sont appelées fonctions simples. Souvent, il suffit de se rappelle en tant que constructeur, mais il y a des cas plus complexes.
constructeurs en javascript [...] ne sont pas censés retourner quoi que ce soit
En général, un constructeur peut ignorer this
et juste retourner un objet indépendant:
function Thing() {
return {'foo': 1};
}
dans ce cas, vous pouvez également utiliser la fonction en tant que constructeur (avec new
) ou une fonction simple.
Si le constructeur ne retourne rien, tout comme le schéma habituel pour les constructeurs, l'opérateur new
assure lui-même qu'il retourne le nouvel objet créé et passé en this
. Dans ce cas, vous devez utiliser new
.
Il est préférable de ne pas compter sur un constructeur de travail en fonction nue, et les comportements alternatifs de INTÉGRÉE dans les constructeurs sont rarement de toute utilisation, de façon générale, vous devriez en tenir à new
.