Оператор new
Синтаксис
const obj = new Constructor(...args);Constructor- функція або клас, який викликається черезnew;...args- аргументи, що передаються конструктору;- результат - новий об'єкт, створений за шаблоном конструктора.
Що робить new під капотом (покроково)
Коли ти пишеш:
const user = new User('Oleh');Рушій виконує чотири кроки:
1. Створюється новий порожній об'єкт
const obj = {};2. Встановлюється прототип
Новий об'єкт отримує посилання на прототип конструктора:
obj.__proto__ = User.prototype;Це означає, що obj успадковує методи з User.prototype.
3. Виконується сам конструктор
Функція User викликається, і this всередині неї вказує на новий об'єкт:
const result = User.call(obj, 'Oleh');4. Повертається об'єкт
Якщо конструктор повертає об'єкт вручну → повертається він.
Інакше → повертається obj, створений на кроці 1.
return typeof result === 'object' ? result : obj;Приклад із функцією-конструктором
function User(name) {
this.name = name;
this.isAdmin = false;
}
const user = new User('Oleh');
console.log(user.name); // "Oleh"
console.log(user.isAdmin); // falseБез
newthisвказував би наwindow(у браузері) абоundefined(у строгому режимі). Тому важливо завжди викликати конструктори зnew.
Приклад з класом
class Car {
constructor(model) {
this.model = model;
}
drive() {
console.log(`${this.model} їде`);
}
}
const tesla = new Car('Tesla');
tesla.drive(); // "Tesla їде"Класи - це просто синтаксичний цукор над функціями-конструкторами. Під капотом
newпрацює точно так само.
Приклад з об'єктом, що повертається
Якщо функція-конструктор повертає об'єкт вручну,
він замінює результат new:
function User(name) {
this.name = name;
return { name: 'Перевизначений' };
}
const u = new User('Oleh');
console.log(u.name); // "Перевизначений"Якщо повертається примітив, він ігнорується:
function Product(name) {
this.name = name;
return 123; // ігнорується
}
const p = new Product('Phone');
console.log(p.name); // "Phone"Приклад без new
function Animal(name) {
this.name = name;
}
const a1 = Animal('Кіт'); // виклик без new
console.log(a1); // undefined
console.log(globalThis.name); // "Кіт" - записалося в глобальну областьТому завжди викликай конструктори через
new, або додавай захист усередині функції:
function Animal(name) {
if (!(this instanceof Animal)) {
return new Animal(name);
}
this.name = name;
}Використання з вбудованими конструкторами
const date = new Date();
const reg = new RegExp('\\d+');
const arr = new Array(3); // [ <3 empty items> ]
const obj = new Object(); // {}Майже всі вбудовані класи (
Date,Map,Set,Error,RegExp,Promise) вимагаютьnew.
Підсумок
| Крок | Що робить new |
|---|---|
| 1 | Створює новий порожній об'єкт |
| 2 | Встановлює прототип obj.__proto__ = Constructor.prototype |
| 3 | Викликає конструктор з this = obj |
| 4 | Повертає об'єкт (або те, що поверне конструктор) |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.