Использование return при создании объектов с помощью new

Сегодня я обнаружил кое-что очень странное: если вы создаете объекты с помощью функции-конструктора и ключевого слова new , но возвращаете функцию из конструктора он ведет себя следующим образом:

  1. Вновь созданный «объект» вместо этого является функцией.
  2. Эта новая функция может быть вызвана как обычно, однако ...
  3. Если вы сохраняете ссылку на this в функции конструктора, this ссылается на объект, который был правильно создается из конструктора. Это то, что вы ожидали получить от нового .

Вот пример:

function Constructor() {
  var self = this;

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

Итак, если вы создали его экземпляр следующим образом: var instance = new Constructor () В результате может получиться следующее:

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

Итак, я думаю, у меня есть три вопроса:

  1. Это законно и работает ли это в кросс-браузере? Это действительно круто, и я думаю, что его можно использовать по-разному, но надежно ли такое поведение?
  2. Что происходит в фоновом режиме, что вызывает такое поведение?
  3. (возможно, ответят 2, но ...) Находится ли новый объект (тот, на который ссылается 'this') внутри нового экземпляра, чтобы он был самодостаточным и правильно очищался сборщиком мусора?
10
задан Kevin McTigue 16 February 2012 в 01:22
поделиться