2012-05-01 15 views
6

estoy leyendo la última ECMA-262 de referencia, la edición de junio de 2011. 5.1¿Es un constructor siempre un objeto de función?

En la sección 8.6.2 cuadro 9 que tenemos en lo que se refiere a la [[Construct]] propiedad interna:

Crea un objeto . Invocado a través del nuevo operador. Los argumentos para el SpecOp son los argumentos pasados ​​al operador nuevo . Los objetos que implementan este método interno se denominan constructores.

La norma no dice que un constructor tiene que ser un objeto Function. Entonces, ¿podemos tener un objeto constructor que no sea un objeto de función?

Link to the standard as requested

+0

¿Podría vincular al documento de especificaciones? No creo que muchas personas puedan responder sin un contexto más completo para la cotización que ha proporcionado. (¡Interesante pregunta, sin embargo!) – apsillers

+2

Puede que le interese el [Anotado ES5] (http://es5.github.com/) que es una conversión HTML de los estándares ECMA-262 PDF 5.1. Tiene anclas de sección como la de [Sección 8.6.2] (http://es5.github.com/#x8.6.2). –

+0

si mal no recuerdo, Crockford dijo que, en general, usar un constructor no es un buen patrón en JS – thepoosh

Respuesta

3

Mientras que el término "Constructor" está definido (como @RobG pointed out), no hay nada que impida que un objeto que no sea "Constructor" tenga un método [[Construct]].

Esto es un poco confuso. Significa que puede usar el operador new en un objeto que no es Function (por lo tanto, no es un "constructor" según 4.3.4 ), pero sí proporciona un método [[Construct]].

Tenga en cuenta que ninguno de los objetos estándar calificar para eso, sino que de hecho puede host objects. Un plugin para el navegador como Java puede exponer un objeto de esta manera:

new java.lang.String(); // it works, so java.lang.String has a [[Construct]] method 
java.lang.String instanceof Function // false 
Object.prototype.toString.call(java.lang.String).indexOf('Function') // -1 

Tenga en cuenta que los rendimientos typeof java.lang.String"function" a pesar de que java.lang.String no es una función. Esto es correcto según la 11.4.3 (se trata de un objeto host con un método [[Call]])

+0

A continuación, se perderá en la semántica de "¿qué es una función?". La especificación solo cubre objetos nativos (incluidos los integrados) y permite explícitamente que los objetos del servidor realicen lo que quieran. Tiene sentido que los creadores de objetos host sigan ECMA-262, pero hay muchos casos en los que no, es bueno ver un ejemplo que no sea IE. :-) – RobG

+0

@RobG No estoy seguro de lo que está tratando de decir aquí. [8.6.2] (http://es5.github.com/#x8.6.2) cubre objetos host en cierta medida. Además, el término "función" se define en [4.3.24] (http://es5.github.com/#x4.3.24) – user123444555621

+0

@RobG Creo que el problema es que la especificación no es totalmente coherente. – Roland

4

La respuesta es muy simple. ES5 § 4.3.4 dice:

Constructor Function object that creates and initialises objects.

Así que ahí lo tienen, por definición, sólo una función puede ser un constructor. Sin embargo, es probable que existan objetos host que se comporten como constructores que no tienen ninguno de los otros atributos de los objetos Function nativos (por ejemplo, el objeto XMLHttpRequest original en IE implementado en ActiveX).

+0

Estoy aceptando esto como la respuesta. En mi humilde opinión, la especificación no está del todo clara ya que parece que un objeto que no es una función todavía puede tener una propiedad interna [[Construir]], al menos la tabla 9 a la que se hace referencia en la pregunta no lo prohíbe explícitamente. Si alguien sabe quién es el autor de la especificación, me gustaría escribirle un correo electrónico y pedirle una aclaración. – Roland

0

Para añadir a Pumbaa80 de answer (esto sería demasiado largo para un comentario).

La confusión aumenta por 13.2.2 según la cual cuandoconstruct se ejecuta una función de su funcionamiento call ha de ser ejecutado (pero no dice lo que tiene que hacerse cuando el construct de un objeto que no es se ejecuta una función). Ahora, los objetos que implementan call se pueden llamar funcionan objetos de acuerdo con 9.11.

También de acuerdo con 4.2 "Una función es un objeto exigible". Pero, por supuesto, esto no implica que cada objeto invocable sea una función.

Así que si obtuve este derecho, los objetos que no son Function pueden tener un método Construct y también un método Call. java.lang.String sería uno de esos ejemplos.

Cuestiones relacionadas