Что происходит при вызове функции с ключевым словом `new`?
Когда мы вызываем функцию с ключевым словом new, происходит создание нового объекта, и несколько ключевых действий выполняются автоматически. Давайте разберем этот процесс шаг за шагом.
Основные шаги при вызове функции с new
-
Создание нового объекта:
- При использовании
newсоздается новый пустой объект. Этот объект будет являться экземпляром функции, которую мы вызываем.
- При использовании
-
Привязка прототипа:
- Прототип нового объекта устанавливается в
prototypeфункции. Это позволяет экземпляру наследовать свойства и методы, определенные вprototype.
- Прототип нового объекта устанавливается в
-
Вызов конструктора:
- Функция вызывается с контекстом нового объекта, что означает, что внутри функции
thisссылается на созданный объект.
- Функция вызывается с контекстом нового объекта, что означает, что внутри функции
-
Возврат объекта:
- Если функция не возвращает объект (например, возвращает примитивное значение), то возвращается созданный объект. Если же функция возвращает объект, то именно этот объект будет результатом вызова.
Пример
Рассмотрим пример, чтобы проиллюстрировать эти шаги:
function Person(name) {
this.name = name;
this.sayHello = function() {
console.log(`Hello, my name is ${this.name}`);
};
}
// Создание нового объекта с использованием `new`
const john = new Person("John");
john.sayHello(); // Выведет: Hello, my name is John
Подробности работы
- При вызове
new Person("John")происходит следующее:- Создается новый объект
john. - Прототип
johnустанавливается наPerson.prototype. - Функция
Personвыполняется, устанавливая свойствоnameобъектаjohn. - Возвращается объект
john.
- Создается новый объект
Альтернативы и их отличия
Если бы мы вызвали функцию Person без new, например:
const jane = Person("Jane");
В этом случае:
- Новый объект не создается.
thisвнутри функции ссылается на глобальный объект (в браузере этоwindow), если функция не была вызвана в строгом режиме (strict mode).- Свойство
nameне будет установлено на новый объект, так как его фактически не существует.
Практические советы
-
Используйте строгий режим: Для предотвращения нежелательного поведения при вызове функции без
new, можно использовать строгий режим. В этом случаеthisбудетundefined. -
Проверка на вызов без
new: В конструкторах можно добавить проверку, чтобы убедиться, что функция вызвана сnew:function Person(name) { if (!(this instanceof Person)) { return new Person(name); } this.name = name; }
Распространенные ошибки
- Неиспользование
new: Часто новички забывают использоватьnew, что приводит к неожиданным результатам, когда свойства не устанавливаются на новый объект. - Возврат примитивных значений: Если конструктор возвращает примитивное значение, это игнорируется, и создается новый объект.
Понимание работы new и механизмов, связанных с созданием объектов, является важным аспектом в JavaScript, особенно при разработке сложных приложений и библиотек.