Этот вопрос углубляет понимание значения this в различных сценариях вызова функций-конструкторов.
При вызове функции-конструктора с оператором new, this равен вновь созданному объекту. Если функция вызывается без new, значение this зависит от контекста вызова - в строгом режиме это undefined, в нестрогом - глобальный объект (window в браузере).
Значение this зависит исключительно от того, как вызывается функция-конструктор.
При корректном использовании с new:
javascript
function Person(name) {
// this ссылается на новый объект
this.name = name;
console.log(this); // Person { name: ... }
}
const person = new Person('Иван');При обычном вызове функции:
javascript
function Person(name) {
this.name = name;
console.log(this); // Зависит от контекста
}
// В нестрогом режиме
Person('Иван'); // this = global/window объект
// В строгом режиме
'use strict';
Person('Иван'); // this = undefined (будет ошибка)Рассмотрим различные сценарии:
javascript
// Пример 1: Обычный вызов с new
function Car(brand) {
this.brand = brand;
console.log(this instanceof Car); // true
}
const car = new Car('Toyota');
// Пример 2: Вызов без new (ошибка)
function Bike(model) {
this.model = model;
}
// Bike('Yamaha'); // Ошибка в строгом режиме
// Пример 3: Вызов метода как конструктора
const obj = {
createCar: function(brand) {
this.brand = brand;
}
};
obj.createCar('BMW'); // this = obj
new obj.createCar('Audi'); // this = новый объектМожно добавить проверку для безопасного использования:
javascript
function SafeConstructor(value) {
// Проверяем, вызвана ли функция с new
if (!(this instanceof SafeConstructor)) {
// Если нет, вызываем себя правильно
return new SafeConstructor(value);
}
this.value = value;
}
// Оба вызова работают одинаково
const obj1 = new SafeConstructor('test');
const obj2 = SafeConstructor('test'); // Автоматически исправляетсяВ классах ES6 вызов без new всегда приводит к ошибке:
javascript
class Person {
constructor(name) {
this.name = name;
}
}
const person = new Person('Иван'); // OK
// Person('Иван'); // Ошибка: Class constructor cannot be invoked without 'new'Вывод: this в функции-конструкторе равен новому объекту только при вызове с new. Всегда используйте new с конструкторами или применяйте защитные проверки для избежания ошибок.