Вопрос проверяет понимание поведения JavaScript при вызове функции с оператором new, когда функция-конструктор не возвращает объект явно.
В JavaScript функция становится конструктором при вызове с оператором new. Понимание того, что происходит, когда такая функция не возвращает значение явно, является ключевым для работы с объектно-ориентированными паттернами в языке.
Когда функция вызывается с new, движок JavaScript выполняет следующие шаги:
prototype этой функции связывается с внутренним свойством [[Prototype]] (или __proto__) нового объекта.this внутри контекста выполнения функции.this, добавляя свойства).undefined или примитивное значение), оператор new автоматически возвращает только что созданный объект, связанный с this. Если функция возвращает другой объект, возвращается именно он.Рассмотрим стандартный случай, когда функция не имеет оператора return:
function Person(name) {
this.name = name;
// Нет оператора return
}
const john = new Person('John');
console.log(john.name); // 'John'
console.log(john instanceof Person); // trueЗдесь new Person создаёт объект, присваивает его this, выполняет this.name = name, а затем, поскольку возвращаемого значения нет (фактически возвращается undefined), оператор new возвращает автоматически созданный объект.
Теперь рассмотрим случай, когда функция возвращает примитив:
function Car(model) {
this.model = model;
return 42; // Возвращает примитив
}
const myCar = new Car('Tesla');
console.log(myCar.model); // 'Tesla'
console.log(myCar instanceof Car); // trueНесмотря на return 42, оператор new игнорирует примитивное значение и всё равно возвращает объект, созданный на шаге 1.
И, наконец, случай явного возврата объекта:
function Animal(type) {
this.type = type;
return { custom: 'object' }; // Явно возвращает другой объект
}
const dog = new Animal('Mammal');
console.log(dog.custom); // 'object'
console.log(dog.type); // undefined
console.log(dog instanceof Animal); // falseЗдесь оператор new видит, что функция возвращает объект, и возвращает именно его, полностью игнорируя объект, созданный на шаге 1 и привязанный к this.
Это поведение лежит в основе классического наследования через конструкторы и прототипы в ES5. Понимание этого механизма критично для:
Вывод: Стандартное и ожидаемое поведение конструктора — не возвращать значение явно, полагаясь на автоматическое создание объекта оператором new. Явный возврат объекта полезен в специфических случаях, например, для реализации синглтонов или мемоизации, но требует осторожности, так как ломает стандартную семантику instanceof.