Сегодня я обнаружил что-то очень странное: если вы создаете объекты со своей конструкторской функцией и ключевым словом new
, а return
- функцию из конструктора, она ведет себя так:
- Недавно созданный "объект" - это функция.
- Эта новая функция может быть вызвана, как обычно,...
- Если вы поддерживаете ссылку на
this
в функции конструктора,this
ссылается на объект, который был правильно создан из конструктора. Это то, что вы ожидали получить отnew
.
Вот пример:
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' }
Итак, у меня есть три вопроса:
- Является ли это законным и работает он кросс-браузер? Это действительно потрясающе, и я думаю, что его можно использовать во многих отношениях, но является ли это поведение надежным?
- Что происходит в фоновом режиме, которое вызывает это поведение?
- (может быть, ответ на 2, но...) Является ли новый объект (тот, на который ссылается 'this') внутри нового экземпляра, так что он все самодостаточен и очищается сборщиком мусора?