Utilizando 'retorno' al crear objetos con 'nuevo'

oy encontré algo muy extraño: si creas objetos con una función de constructor y lanew palabra clave, peroreturn una función del constructor, se comporta así:

El "objeto" recién creado es, en cambio, una función. Esa nueva función se puede invocar como normal, sin embargo ... Si mantiene una referencia athis en la función constructora,this hace referencia a un objeto que se creó correctamente desde el constructor. Es lo que esperaba que regresara denew.

Aquí hay un ejemplo:

function Constructor() {
  var self = this;

  this.name = 'instance';
  return function() {
    return self;
  }
}

Entonces, si lo instanciaste así:var instance = new Constructor() Lo siguiente resultaría:

typeof instance    //returns "function"
typeof instance()  //returns "object"
instance()         //returns { name: 'instance' }

Así que supongo que tengo tres preguntas:

¿Es legal y funciona entre navegadores? 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? (tal vez respondido por 2, pero ...) ¿Está el nuevo objeto (al que se hace referencia con 'esto') dentro de la nueva instancia, de modo que todo es autónomo y el recolector de basura lo limpia correctamente?

Respuestas a la pregunta(6)

Su respuesta a la pregunta