valores recorrer objetos objeto new metodos lista eliminar elemento añadir array javascript constructor new-operator object-construction

objetos - recorrer json javascript



JavaScript: usando el constructor sin operador ''nuevo'' (2)

+1 TJ Crowder lo tiene. El estándar ECMAScript se desvía para definir comportamientos para las funciones de constructor integradas cuando se las llama como funciones simples. A menudo, simplemente se vuelve a llamar a sí mismo como un constructor, pero hay algunos casos más complicados.

los 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, también puede utilizar la función como un constructor (con new ) o una función simple.

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

Es mejor no confiar en un constructor que funcione como una función simple, y los comportamientos alternativos de los constructores incorporados rara vez son de alguna utilidad, por lo que, por lo general, debería quedarse con lo new .

Por favor, ayúdame a entender 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 operador new .

Por lo que sé, un contructor en JavaScript es una función que inicializa los objetos creados por el operador new y no están destinados a devolver nada.


En general, si algo se documenta como un constructor, use new con él. Pero en este caso, RegExp tiene un comportamiento "de fábrica" ​​definido para la situación en la que lo ha llamado como una función. Consulte la Sección 15.10.3 de la specification ECMAScript (JavaScript) (que enlaza con la especificación saliente; el número de la sección es el mismo en la nueva especificación, que puede descargar desde la página frontal de ECMA [en el lado derecho]; no quiero enlazar directamente a un archivo PDF de ~ 4MB):

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

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