JavaScript: utiliser le constructeur sans l'opérateur "nouveau"

Merci de m'aider à comprendre pourquoi le code suivant fonctionne:

<script>
    var re = RegExp('bab') ;
    alert(re.test('a')) ;
    alert(re.test('ab')) ;
</script>

Dans la première ligne il n'y a pas de new opérateur.

autant Que je sache, un constructeur JavaScript est une fonction qui initialise les objets créés par l'opérateur new et ils ne sont pas censés rendre quoi que ce soit.

26
demandé sur GetFree 2009-12-18 16:56:54

2 réponses

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 "d'usine" défini pour la situation où vous l'Avez Appelé comme une fonction à la place. Voir la Section 15.10.3 de L'ECMAScript (JavaScript)cahier des charges (qui renvoie à la spécification sortante; le numéro de section est le même dans la nouvelle spécification, que vous pouvez télécharger à partir de L'ECMA première page [sur la droite]; Je ne veux pas directement lien vers un ~4 MO fichier PDF):

15.10.3 le constructeur RegExp appelé comme une fonction

15.10.3.1 RegExp(modèle, drapeaux)

Si pattern est un objet R dont la propriété [[Class]] est "RegExp" et que les drapeaux ne sont pas définis, alors retournez R inchangé. Sinon, appelez le constructeur RegExp (15.10.4.1), passez-lui les arguments pattern et flags et retournez l'objet construit par celui-ci. constructeur.

vous pouvez en fait définir vos propres fonctions de constructeur JavaScript pour permettre d'omettre le new mot-clé (en détectant qu'ils ont été appelés comme une fonction à la place, et en se retournant et en s'appelant correctement), mais je ne le suggérerais pas car cela conduit à du code trompeur.

36
répondu T.J. Crowder 2009-12-18 14:54:39

+1 TJ Crowder l'A. Le standard ECMAScript s'écarte de la norme pour définir les comportements des fonctions de constructeur intégrées lorsqu'elles sont appelées fonctions simples. Souvent il se rappelle simplement comme un constructeur, mais il y a des cas plus compliqués.

constructeurs en javascript [...] ne sont pas destinés à retourner rien

En général, un constructeur ignorer this et juste de retour d'un indépendant objet:

function Thing() {
    return {'foo': 1};
}

dans ce cas, vous pouvez également utiliser la fonction en tant que constructeur (avec new) ou une simple fonction.

Si le constructeur ne retourne rien, comme c'est le schéma habituel pour les constructeurs, le new l'opérateur lui-même s'assure qu'il renvoie le nouvel objet créé et passé comme this. Dans ce cas, vous devez utiliser new.

il est préférable de ne pas se fier à un constructeur travaillant comme une fonction nue, et les comportements alternatifs de la les constructeurs intégrés sont rarement d'aucune utilité, donc généralement vous devriez vous en tenir à new.

10
répondu bobince 2009-12-18 14:21:06