he encontrado algo muy extraño hoy en día: Si crea objetos con una función constructora y la palabra clave new
, pero return
una función desde el constructor, se comporta de esta manera:El uso de 'retorno' al crear objetos con 'nuevo'
- El "objeto" creado recientemente es una función.
- Esa nueva función puede ser invocada como normal, sin embargo ...
- Si mantiene una referencia a
this
en la función constructora,this
referencia a un objeto que se ha creado correctamente desde el constructor. Es lo que espera que se devuelva desdenew
.
He aquí un ejemplo:
function Constructor() {
var self = this;
this.name = 'instance';
return function() {
return self;
}
}
Así que si instanciado como esto: var instance = new Constructor()
A continuación se traduciría:
typeof instance //returns "function"
typeof instance() //returns "object"
instance() //returns { name: 'instance' }
así que supongo que tengo tres preguntas:
- ¿Es esto legal y funciona? k cross-browser? Es realmente increíble y creo que se puede usar de muchas maneras, pero ¿es confiable este comportamiento?
- ¿Qué sucede en el fondo que causa este comportamiento?
- (quizás responda por 2, pero ...) ¿Está el nuevo objeto (el que se menciona con 'this') dentro de la nueva instancia, de modo que sea todo independiente y el recolector de basura lo limpie correctamente?
Es un error 'devolver' cualquier cosa de un constructor, lo último que escuché. –