Этот вопрос проверяет понимание поведения ключевого слова this в контексте функций-конструкторов и механизма их работы.
При вызове функции-конструктора с оператором new, значение this автоматически устанавливается на вновь созданный объект. Этот объект создается неявно до выполнения кода конструктора. Все свойства и методы, добавленные через this, становятся частью создаваемого объекта.
Значение this внутри функции-конструктора определяется способом вызова функции.
Когда функция вызывается с оператором new, происходит следующее:
javascript
function Car(brand, model) {
// this автоматически ссылается на новый объект
this.brand = brand;
this.model = model;
this.year = 2024;
}
const myCar = new Car('Toyota', 'Camry');Оператор new выполняет четыре шага:
Создание объекта: Создается новый пустой объект
Установка прототипа: Прототип объекта связывается с свойством prototype конструктора
Привязка this: this связывается с созданным объектом
Возврат объекта: Если функция не возвращает объект, возвращается this
Без оператора new поведение this отличается:
javascript
function Car(brand) {
this.brand = brand;
}
// С new - this ссылается на новый объект
const car1 = new Car('Toyota');
console.log(car1.brand); // "Toyota"
// Без new - this зависит от контекста (в строгом режиме undefined)
const car2 = Car('Honda'); // Ошибка или добавление в глобальный объектВ строгом режиме поведение становится более предсказуемым:
javascript
'use strict';
function Car(brand) {
this.brand = brand;
}
const car = new Car('Toyota'); // Работает
Car('Honda'); // Ошибка: Cannot set property 'brand' of undefinedДля защиты от вызова без new можно использовать проверки:
javascript
function Car(brand) {
if (!(this instanceof Car)) {
throw new Error('Конструктор Car должен вызываться с new');
}
this.brand = brand;
}Вывод: В функции-конструкторе this всегда ссылается на создаваемый объект при вызове с new. Понимание этого механизма важно для правильного использования конструкторов и избежания ошибок.