Pregunta

Ayúdenme a comprender por qué funciona el siguiente código:

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

En la primera línea no hay new operador.

Hasta donde yo sé, un constructor en javascript es una función que inicializa objetos creados por el operador new y no están destinados a devolver nada.

¿Fue útil?

Solución

En general, si algo está documentado como constructor, utilice new con eso.Pero en este caso, RegExp tiene un comportamiento de "fábrica" ​​definido para la situación en la que lo has llamado como una función.Consulte la Sección 15.10.3 de ECMAScript (JavaScript) especificación (que enlaza con la especificación saliente;el número de sección es el mismo en la nueva especificación, que puede descargar desde ECMA página delantera [al lado derecho];No quiero vincular directamente a un archivo PDF de ~4 MB):

15.10.3 El constructor RegExp llamado como función
15.10.3.1 RegExp (patrón, banderas)
Si el patrón es un objeto R cuya propiedad [[Clase]] es "RegExp" y las banderas no están definidas, entonces devuelve R sin cambios.De lo contrario, llame al constructor RegExp (15.10.4.1), pasándole los argumentos de patrón y banderas y devuelva el objeto construido por ese constructor.

De hecho, puedes definir tus propias funciones de constructor de JavaScript para permitir omitir el new palabra clave (al detectar que han sido llamados como una función, y darse la vuelta y llamarse a sí mismos correctamente), pero no lo sugeriría ya que conduce a un código engañoso.

Otros consejos

1 TJ Crowder lo tiene. El estándar ECMAScript se sale de su manera de definir los comportamientos de las funciones constructoras integrados si es llamado como funciones simples. A menudo simplemente se llama a sí mismo atrás como un constructor, pero hay algunos casos más complicados.

  

constructores en Javascript [...] no están destinados a devolver nada

En general, un constructor puede ignorar this y simplemente devolver un objeto independiente:

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

En este caso se puede usar igualmente la función como un constructor (con new) o una función normal.

Si el constructor no devuelve nada, como es el patrón habitual para los constructores, el propio operador new asegura que devuelve el nuevo objeto creado y aprobado como this. En este caso se debe utilizar new.

Es mejor no depender de un constructor de trabajo en función al descubierto, y los comportamientos alternativos de los incorporados en los constructores rara vez son de utilidad, por lo general, usted debe pegarse con new.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top