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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top